12

我需要从 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'"......

想法?

4

5 回答 5

8

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

<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。

于 2012-07-30T12:11:29.270 回答
1

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

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

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

于 2012-07-30T08:42:55.267 回答
1

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

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

于 2014-04-15T07:18:54.720 回答
0

JdbcLogger 会这样做。http://jdbclogger.sourceforge.net/。支持 mysql、postgres 和 spring 集成。

于 2014-08-12T16:45:22.707 回答
0

另一种选择是使用数据源代理,它允许监听不同的 JDBC 事件,包括查询执行。

您可以实现QueryExecutionListener.beforeQuery接收QueryInfoSQL 查询文本和所有参数。

于 2019-04-30T13:49:51.037 回答