1. 程式人生 > >想看Hibernate生成的SQL語句?

想看Hibernate生成的SQL語句?

     近段時間工作中開始大面積使用hibernate了,在使用過程中難免有這樣那樣的問題,問題出來後怎麼解決,當然首先是跟同事商量,畢竟這樣的效率最高,若同事忙或別的什麼原因,上網查有沒有類似的問題,別人是怎麼解決的, 不過有時這個也是不太方便的,雖說現在搜尋這麼發達,但在短時間內搜到一個不錯解決方案也很不容易。 於是就逼著自己去想別的途徑。

     檢視原始碼是個不錯的選擇。
     當然檢視生成的sql語句,hibernate本身也是支援的,可以通過配置show_sql=true讓sql在控制檯上顯示,不過這個方法很不方便, 畢竟還得改那個配置,而且這個sql也只是在控制檯上顯示出來,咱們也不能真正看到它活生生地應用.


     我在這裡介紹的是通過在原始碼中設定斷點來"追蹤""現場版"的sql.

     至於怎麼來配置原始碼,怎麼設定斷點,在這也就不用多說了吧。


     在這些天解決問題過程中, 我無意中發現了怎麼來檢視hibernate生成sql的方法,本著“予人餘

香,手留玫瑰”的原則,寫在這裡,又好久沒寫部落格了。

 

     hibernate自身的一些概念,就不在這多說了,下面就直奔主題吧,呵呵,其實也說了不少廢話了




     在org.hibernate.loader.Loader類的裡找到prepareQueryStatement方法,這個方法裡有這麼一句

呼叫:

     String sql = queryParameters.getFilteredSQL();  

     這裡的變數sql裡就是生成的SQL語句了,
     如下圖所示:

     hibernate生成的sql



            當然這不是最終的sql,圖片中也看到了,接下來,hibernate會根據具體的資料庫dialect再對這個sql做進一步的處理.

     至此, 我們看到了"活生生"的sql.

     下面順便也說個關於跟蹤原始碼的題外話,其實看hibernate的原始碼也有好久一段時間了, 但像今天看到生成的sql這樣很實用的心得倒不是很多. 當然這樣說,我的意思不是說,看hibernate原始碼就沒什麼用了, 在這我想說的是,有些時候, 能抓住很實用的東西是需要積累的. 現在感覺這個過程就像玩掃雷這個小遊戲, 在剛開始玩時, 總是摸不著頭緒, 可能沒點幾下就中了頭彩, 於是尤其在剛開始時,我們大多是亂點一起, 點了兩三下後發現自己還"活"著, 就開始認定地順著局勢分析了. 在剛開始看hibernate原始碼時,也有類似的經歷,hibernate那麼多包,又有那多麼類,該看哪一個呢?該如何走呢?  這麼一團亂麻,這怎麼看呀? 但懷著對hibernate作者的崇拜,心裡也還是好奇,從Object到Relational這樣的mapping過程究竟是怎麼自動實現的.於是就東看一個類,西看一個類地進行著.後來再結合IDE的debug功能, 看這些類是怎麼配合合作的.這樣積累下來,終於有了今天這個實用.

    那這個技巧在實際解決問題中又是怎麼實用呢?請看下一篇,用<用在hibernate裡用Projection裡的一個問題>,呵呵,看百家講壇有點多了.