Hibernate打印SQL及附加參數


今天在項目運行過程中,一直報一個org.hibernate.exception.GenericJDBCException: could not insert 異常,Root Cause是IBM  DB2 ErrorCode=-180,sqlstate=22007,經過Google,發現這個錯誤的原因是因為Timestamp的格式不規范導致,但是具體是哪一項,卻不太清楚,如果能夠打印出導致問題的SQL語句,那么對於這類問題的定位就會非常容易了。

      在Hibernate的配置文件hibernate.cfg.xml中有3個設置項跟顯示SQL語句相關,他們的值都是boolean值:
    (1)、show_sql:是否顯示SQL語句
    (2)、format_sql: 是否格式化輸出字符串,增強SQL的可讀性
    (3)、use_sql_comments:是否顯示注釋,用於指示出是什么操作產生了這個SQL語句。
   
     在默認情況下,Hibernate會把SQL語句打印在Console上,因此在開啟了上面的設置之后,可以在控制台上看到如下結構的SQL語句:

Console代碼   收藏代碼
  1. /* load collection cc.unmi.test.model.Post.securities */ select  
  2.        securities0_.post_id as post1_7_1_,  
  3.        security1_.shareclassid as sharecla1_16_0_,  
  4.        security1_.company_id as company2_16_0_,  
  5.    from  
  6.        Post_Security_Relationship securities0_  
  7.    inner join  
  8.        unmi.securities security1_  
  9.            on securities0_.shareclassid=security1_.shareclassid  
  10.    where  
  11.        securities0_.post_id=?  


   可以發現,在控制台上根本看不到,SQL語句對應的參數,一般情況下,Hibernate都會和Log4j配合使用,這樣就可以更加靈活的控制hibernate的日志文件輸出。在hibernate中,默認的關於SQL語句對應參數的輸出級別為TRACE,比默認的Log4j的日志等級DEBUG還要低一等級,因此,為了顯示參數,還需手動設置一下log4j的配置,把hibernate下的輸出等級改為TRACE:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j. loggerorg.hibernate.type.descriptor.sql.BasicExtractor=TRACE 
這樣修改之后,打印的SQL語句會變為如下形式:

Console代碼   收藏代碼
  1. 20:13:40.710 [http-8080-1] DEBUG org.hibernate.SQL -  
  2.     /* load collection cc.unmi.test.model.Post.categories */ select  
  3.         categories0_.post_id as post1_7_1_,  
  4.         elementite1_.id as id3_0_,  
  5.     from  
  6.         Post_Category_Relationship categories0_  
  7.     inner join  
  8.         unmi.element_item elementite1_  
  9.             on categories0_.category_id=elementite1_.id  
  10.     where  
  11.         categories0_.post_id=?  
  12. 20:13:40.710 [http-8080-1] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 10  
  13. 20:13:40.710 [http-8080-1] TRACE org.hibernate.type.descriptor.sql.BasicExtractor - found [1002] as column [id3_0_]  
  14. 20:13:40.710 [http-8080-1] TRACE org.hibernate.type.descriptor.sql.BasicExtractor - found [10] as column [post1_7_1_]  


如果還想查看查詢中命名參數的值,還需要在log4j的配置文件中加上如下的值:
log4j.logger.org.hibernate.engine.QueryParameters=DEBUG
log4j.logger.org.hibernate.engine.query.HQLQueryPlan=DEBUG
這樣修改之后,可以得到如下的結果:

Console代碼   收藏代碼
    1. 20:13:40.710 [http-8080-1] org.hibernate.engine.query.HQLQueryPlan - find: from User where email = :email  
    2. 20:13:40.710 [http-8080-1] org.hibernate.engine.QueryParameters - named parameters: {email=fantasia@sina.com}  
    3. 20:13:40.726 [http-8080-1] org.hibernate.SQL -  
    4.     /* named HQL query findUserByEmail */ select  
    5.         user0_.id as id0_,  
    6.         user0_.email as email0_,  
    7.         user0_.enabled as enabled0_,  
    8.         user0_.encodedPassword as encodedP8_0_  
    9.     from  
    10.         User user0_  
    11.     where  
    12.         user0_.email=? 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM