我需要从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'"
...
想法?
答案 0 :(得分:8)
您必须将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。
答案 1 :(得分:1)
没有“带参数值的完整SQL字符串”。
Hibernate使用预处理语句,因此它将带有?
和查询值的查询字符串分别发送到数据库,以便永远不会构造实际查询。
也许您可以找到从QueryImpl
提取参数值的方法,但即使在这种情况下,您也无法准备执行查询,因为您需要处理转义,转换参数值到SQL文字等。
答案 2 :(得分:1)
有一个名为p6spy的工具。它有点老了,我担心它不再维护了。无论如何,它在过去给了我很好的结果。
编辑:刚刚发现它正在积极开发。对我来说就像一个魅力!
答案 3 :(得分:0)
JdbcLogger就是这样做的。 http://jdbclogger.sourceforge.net/。支持mysql,postgres和spring集成。
答案 4 :(得分:0)
另一种选择是使用datasource-proxy,它允许侦听包括查询执行在内的不同JDBC事件。
您可以实现QueryExecutionListener.beforeQuery来接收带有SQL查询文本和所有参数的QueryInfo
。