从Hibernate查询中获取SQL String

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Hibernate查询中获取SQL String相关的知识,希望对你有一定的参考价值。

我需要从Hibernate查询中获取字符串并稍后处理它(所以我无法使用"hibernate.show_sql"解决它)。

我已经查看了How to get SQL from Hibernate Criteria API (*not* for logging),但是通过该解决方法,我得到了SQL查询字符串,但没有显示参数值,而是显示'?'...有没有办法获取带有参数值的完整SQL字符串?

我的意思是,有了这个解决方案,我得到了"SELECT * FROM USER WHERE NAME=? AND SURNAME=?",但我需要得到"SELECT * FROM USER WHERE NAME='John' AND SURNAME='Doe'" ......

想法?

答案

有一个名为p6spy的工具。它有点老了,我担心它不再维护了。无论如何,它在过去给了我很好的结果。

编辑:刚刚发现它正在积极开发。对我来说就像一个魅力!

另一答案

您必须将TRACE级别的日志记录设置为此hibernate包,并且参数绑定应显示在应用程序日志中:

<category name="org.hibernate.type">
      <priority value="TRACE"/>
</category>

输出示例:

13:58:51,505 DEBUG [SQL] 
 insert 
        into
            s.audit
            (action, e_s, ip, time, userid, id) 
        values
            (?, ?, ?, ?, ?, ?)
13:58:51,505 TRACE [StringType] binding 'Modify user' to parameter: 1
13:58:51,505 TRACE [StringType] binding 'E' to parameter: 2
13:58:51,505 TRACE [StringType] binding '164.20.81.65' to parameter: 3
13:58:51,505 TRACE [TimestampType] binding '2012-07-30 13:58:51' to parameter: 4
13:58:51,505 TRACE [IntegerType] binding '158' to parameter: 5
13:58:51,505 TRACE [IntegerType] binding '8851' to parameter: 6

并且不要忘记您之前说过的'hibernate.show_sql=true'属性也显示了相关的SQL。

另一答案

没有“带参数值的完整SQL字符串”这样的东西。

Hibernate使用预处理语句,因此它将带有?s和参数值的查询字符串分别发送到数据库,以便永远不会构造实际查询。

也许您可以找到从QueryImpl中提取参数值的方法,但即使在这种情况下,您也无法获得执行的查询,因为您需要处理转义,将参数值转换为SQL文本等。

另一答案

JdbcLogger就是这样做的。 http://jdbclogger.sourceforge.net/。支持mysql,postgres和spring集成。

另一答案

另一个选择是使用datasource-proxy,它允许侦听不同的JDBC事件,包括查询执行。

您可以实现接收带有SQL查询文本和所有参数的QueryExecutionListener.beforeQueryQueryInfo

以上是关于从Hibernate查询中获取SQL String的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate缓存

我可以从 JPA 查询对象中获取 SQL 字符串吗?

Hibernate:如何从具有多个类的查询中获取结果

hibernate之SQL查询

Hibernate的批量查询——原生sql查询

hibernate中hql语句中list和iterate区别