问题 从Hibernate查询中获取SQL String


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

我已经看过了 如何从Hibernate Criteria API获取SQL(* not *用于记录) 但是通过这种解决方法,我获得了SQL查询字符串,但没有显示参数值,而是显示'?'...有没有办法获取带参数值的完整SQL字符串?

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

想法?


1873
2017-07-30 08:34


起源

你检查过任何答案吗? - jelies


答案:


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

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


1
2018-04-15 07:18





你必须设置 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。


8
2017-07-30 12:11



没关系,但我需要“整体”查询,例如:插入s.audit(action,e_s,ip,time,userid,id)值('Modify user','E','164.20.81.65',' 2012-07-30 13:58:51','158','8851')... - diminuta
你所说的“整体”查询是不可能的,这是我认为最接近的解决方案:( - jelies
无论如何,非常感谢你:/ - diminuta


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

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

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


1
2017-07-30 08:42



谢谢,我担心没有解决方案...... - diminuta


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


0
2017-08-12 16:45