有没有办法从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)

然后, idea 是将SQL用作大型"减号"查询的一部分(我需要找出两个相同模式之间的差异—— struct 相同,而不是数据相同——并且Hibernate不支持减号)

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

推荐答案

我使用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中,使用风险自负.

Sql相关问答推荐

使用子查询和连接更新PostgreSQL

即使缺少某些行,如何查找特定窗口期的平均销售额

如何在联接条件不匹配时按日期获取上一条记录

从自定义日期和时间开始,每月具有给定状态的公司数量

雅典娜嵌套Json提取液

使用SQL创建列出两个时间戳之间小时数的列

导出部分条形码字符串GS1-128

将计算列设置为持久化的目的是什么?

Redshift PL/pgSQL循环中的参数化列名

MS Access问题查询中的自定义字段

违反了完整性约束-值存在时找不到父键

如何向 mariadb 添加外键?

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

SQL的左连接在多对多关系情况下使用

在自引用表中使用分组和计数的SQL查询语句

如何使用SQL将患者平均分配给他们所在地区的doctor

获取 SQL Server 中每一行的两个-之间的文本

在 BigQuery 数据集中查找表大小和占总数据集大小的百分比

连接表时避免重复