一尘不染

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

hibernate

有没有一种简单的方法可以从hibernate条件中获取(待生成的)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)


阅读 291

收藏
2020-06-20

共1个答案

一尘不染

我已经使用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);

尝试将所有物品包装起来并使用,后果自负。

2020-06-20