• 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=? 
  • 相关阅读:
    Android开发效率—Eclipse快捷键
    Android学习笔记之AndroidManifest.xml文件解析
    Android开发环境的安装 Eclipse
    运用CodeSmith Studio实现C#项目构架
    使用C#开发ActiveX控件(新) 转 http://www.cnblogs.com/yilin/p/csharp-activex.html
    C# winFrom 制作、打包、签名、发布Activex全过程
    C# Server.MapPath()
    PowerDesigner导出表到word
    powerdesigner 15 如何导出sql schema
    PowerDesigner15使用时的十五个问题
  • 原文地址:https://www.cnblogs.com/xiaohui123-com/p/6547079.html
Copyright © 2020-2023  润新知