猿问

如何从Hibernate Criteria API获取SQL(*不*用于记录)

有没有一种简单的方法可以从休眠条件中获取(待生成的)SQL?


理想情况下,我会像这样:


Criteria criteria = session.createCriteria(Operator.class);


... build up the criteria ...

... and then do something like ...


String sql = criteria.toSql()


(But this of course does not exist)

然后的想法是将sql用作巨大的“ MINUS”查询的一部分(我需要找到2个相同模式之间的差异-结构相同,而不是数据相同-并且Hibernate不支持MINUS)


(顺便说一句,我知道我可以从日志文件中检查SQL)


吃鸡游戏
浏览 1011回答 3
3回答

慕姐4208626

我已经使用Spring AOP完成了这样的事情,因此我可以获取应用程序中运行的任何查询的sql,参数,错误和执行时间,无论是HQL,Criteria还是本机SQL。这显然是脆弱,不安全的,可能会因Hibernate中的更改而中断,等等,但它说明可以获取SQL:CriteriaImpl c = (CriteriaImpl)query;SessionImpl s = (SessionImpl)c.getSession();SessionFactoryImplementor factory = (SessionFactoryImplementor)s.getSessionFactory();String[] implementors = factory.getImplementors( c.getEntityOrClassName() );CriteriaLoader loader = new CriteriaLoader((OuterJoinLoadable)factory.getEntityPersister(implementors[0]),    factory, c, implementors[0], s.getEnabledFilters());Field f = OuterJoinLoader.class.getDeclaredField("sql");f.setAccessible(true);String sql = (String)f.get(loader);尝试将所有物品包装起来并使用,后果自负。

MM们

这是获取SQL的“另一种”方法:CriteriaImpl criteriaImpl = (CriteriaImpl)criteria;SessionImplementor session = criteriaImpl.getSession();SessionFactoryImplementor factory = session.getFactory();CriteriaQueryTranslator translator=new CriteriaQueryTranslator(factory,criteriaImpl,criteriaImpl.getEntityOrClassName(),CriteriaQueryTranslator.ROOT_SQL_ALIAS);String[] implementors = factory.getImplementors( criteriaImpl.getEntityOrClassName() );CriteriaJoinWalker walker = new CriteriaJoinWalker((OuterJoinLoadable)factory.getEntityPersister(implementors[0]),                         translator,                        factory,                         criteriaImpl,                         criteriaImpl.getEntityOrClassName(),                         session.getLoadQueryInfluencers()   );String sql=walker.getSQLString();
随时随地看视频慕课网APP

相关分类

Java
MySQL
我要回答