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

新手上路,请多包涵

有没有办法从 Hibernate Criteria 获取(待生成的)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)

原文由 David Bulté 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 417
2 个回答

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

将整个内容包装在 try/catch 中,使用风险自负。

原文由 Brian Deterling 发布,翻译遵循 CC BY-SA 2.5 许可协议

这是获取 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();

原文由 ramdane.i 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题