2012-07-30 58 views
11

我需要从Hibernate查询中获取字符串并稍后处理它(所以我无法使用"hibernate.show_sql"解决此问题)。从休眠查询获取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

你检查了任何答案吗? – jelies 2012-09-25 17:34:39

回答

1

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

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

1

没有“具有参数值的完整SQL字符串”这样的事情。

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

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

+0

谢谢,我怕没有解决方案... – diminuta 2012-09-26 16:35:49

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。

+0

没关系,但我需要“整个”查询,如:插入到s.audit(动作,e_s,ip,时间,用户ID,ID)值( '修改用户','E','164.20.81.65','2012-07-30 13:58:51','158','8851')... – diminuta 2012-09-26 16:33:20

+0

“整个”查询如你所说是不可能的,这是我认为最接近的解决方案:( – jelies 2012-09-26 18:33:19

+0

无论如何非常感谢:/ – diminuta 2012-10-09 15:23:23