2012-07-30 56 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