今天在项目运行过程中,一直报一个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语句:

  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语句会变为如下形式:

  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

这样修改之后,可以得到如下的结果:

    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=?

Hibernate打印SQL及附加参数的更多相关文章

  1. hibernate打印sql日志及参数

    #log4j.properties log4j.rootLogger=info, CA# ConsoleAppenderlog4j.appender.CA=org.apache.log4j.Conso ...

  2. hibernate 打印sql和参数的配置

    1.配置spring-hiberbate.xml:<prop key="hibernate.show_sql">true</prop>--强制打印sql 不 ...

  3. jpa hibernate 打印sql,format日志,打印SQL参数,打印什么指令

    环境说明:IntelliJ IDEA 2017.3.4 版本:SpringBoot 2.0.0.RELEASE:hibernate用的是JPA自带. 打印SQL 到控制台: 首先,我使用的是appli ...

  4. SpringDataJpa打印Sql详情(含参数)

    Spring Data Jpa打印Sql详情(带sql参数) 这里使用的是 log4jdbc,yml配置文件里的数据源配置也要做相应的修改 pom文件引入 <dependency> < ...

  5. hibernate防止sql注入对参数赋值传参数的例子

    来源于:https://my.oschina.net/u/1754093/blog/707083 1.按参数名称绑定 在HQL语句中定义命名参数要用":"开头,形式如下: Quer ...

  6. [JBoss] - 在Jboss 7.1 AS中打印hibernate的SQL方法

    因为JBoss使用的是log4j,JBoss的系统日志级别默认是INFO.而Hibernate或IBatis要打印SQL,级别为DEBUG,所以,程序设置了log4j级别为DEBUG会被JBoss系统 ...

  7. 灵活控制 Hibernate 的日志或 SQL 输出(包含参数),以便于诊断

    首先参考:http://blog.csdn.net/zljjava/article/details/7534349  [灵活控制 Hibernate 的日志或 SQL 输出,以便于诊断] 我的具体配置 ...

  8. Hibernate原生SQL查询

    最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...

  9. Hibernate:SQL查询 addScalar()或addEntity()

      Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该 ...

随机推荐

  1. ORA-01555经典错误

    --创建undo表空间时固定表空间的大小 sys@TDB112>create undo tablespace undo_small 2  datafile'/u01/app/oracle/ora ...

  2. Sql Server 查询多行并一行

    干货 CREATE TABLE #benefit_code21 (id INT, number nvarchar(MAX), pname ), collegeID INT, applicationda ...

  3. Spring3.2AOP实现需要添加的三个包

    Spring3.2AOP实现需要添加的三个包 http://down.51cto.com/data/1001395 http://down.51cto.com/data/519542

  4. Paxos 实现日志复制同步(Multi-Paxos)

    Paxos 实现日志复制同步 这篇文章以一种易于理解的方式来解释 Multi-Paxos 的机制. Multi-Paxos 的是为了创建日志复制 一种实现方式是用一组基础 Paxos 实例,每条记录都 ...

  5. The certificate used to sign "" has either expired or has been revoked.

    这句话的意思就是"签名"的证书已过期或已被吊销. 说白了就是有人删除了你的证书,解决的办法就是在创建一个,创建证书有两种办法,. 第一: 在苹果开发者中心,进入自己的账号,请求一个 ...

  6. java系列笔记---正则表达式(2)

    正则表达式 说真的正则表达式真不好写,当我收集资料准备开始写的时候,发现收集的东西越来越多范围也越来越广,我文章的前提就是文章要清晰, 在缕清自己思路之后,我从先简后难的方式来写有关正表达式,你们如果 ...

  7. look look C#7

    vs2017也rc好几个版本了,本想跟进看看c#7加入了什么内容,去搜索c#7,确实找到了不少文章,无奈很多特性ide根本不让编译啊...所以今天主要列出已经确定了的c#7特性(一般来说rc后也不会加 ...

  8. 时间处理之strtotime

    strtotime (PHP 4, PHP 5, PHP 7)strtotime - 将任何英文文本的日期时间描述解析为 Unix 时间戳说明 int strtotime ( string $time ...

  9. view里面的tableview顶部被view的导航栏盖住了的问题

    在你要显示的控制器的viewDidLoad中添加代码 self.edgesForExtendedLayout = UIRectEdgeNone; 另外记住tableView要遵循代理cell才能显示. ...

  10. sql的一点总结<一>

    sql总结 1.常见的数据库对象有哪些?表(table) 视图(view) 序列(sequence) 索引(index) 同义词(synonym)存储过程(procedure) 存储函数(functi ...