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语句:
- /* load collection cc.unmi.test.model.Post.securities */ select
- securities0_.post_id as post1_7_1_,
- security1_.shareclassid as sharecla1_16_0_,
- security1_.company_id as company2_16_0_,
- from
- Post_Security_Relationship securities0_
- inner join
- unmi.securities security1_
- on securities0_.shareclassid=security1_.shareclassid
- where
- 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语句会变为如下形式:
- 20:13:40.710 [http-8080-1] DEBUG org.hibernate.SQL -
- /* load collection cc.unmi.test.model.Post.categories */ select
- categories0_.post_id as post1_7_1_,
- elementite1_.id as id3_0_,
- from
- Post_Category_Relationship categories0_
- inner join
- unmi.element_item elementite1_
- on categories0_.category_id=elementite1_.id
- where
- categories0_.post_id=?
- 20:13:40.710 [http-8080-1] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 10
- 20:13:40.710 [http-8080-1] TRACE org.hibernate.type.descriptor.sql.BasicExtractor - found [1002] as column [id3_0_]
- 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
这样修改之后,可以得到如下的结果:
- 20:13:40.710 [http-8080-1] org.hibernate.engine.query.HQLQueryPlan - find: from User where email = :email
- 20:13:40.710 [http-8080-1] org.hibernate.engine.QueryParameters - named parameters: {email=fantasia@sina.com}
- 20:13:40.726 [http-8080-1] org.hibernate.SQL -
- /* named HQL query findUserByEmail */ select
- user0_.id as id0_,
- user0_.email as email0_,
- user0_.enabled as enabled0_,
- user0_.encodedPassword as encodedP8_0_
- from
- User user0_
- where
- user0_.email=?
Hibernate打印SQL及附加参数的更多相关文章
- hibernate打印sql日志及参数
#log4j.properties log4j.rootLogger=info, CA# ConsoleAppenderlog4j.appender.CA=org.apache.log4j.Conso ...
- hibernate 打印sql和参数的配置
1.配置spring-hiberbate.xml:<prop key="hibernate.show_sql">true</prop>--强制打印sql 不 ...
- jpa hibernate 打印sql,format日志,打印SQL参数,打印什么指令
环境说明:IntelliJ IDEA 2017.3.4 版本:SpringBoot 2.0.0.RELEASE:hibernate用的是JPA自带. 打印SQL 到控制台: 首先,我使用的是appli ...
- SpringDataJpa打印Sql详情(含参数)
Spring Data Jpa打印Sql详情(带sql参数) 这里使用的是 log4jdbc,yml配置文件里的数据源配置也要做相应的修改 pom文件引入 <dependency> < ...
- hibernate防止sql注入对参数赋值传参数的例子
来源于:https://my.oschina.net/u/1754093/blog/707083 1.按参数名称绑定 在HQL语句中定义命名参数要用":"开头,形式如下: Quer ...
- [JBoss] - 在Jboss 7.1 AS中打印hibernate的SQL方法
因为JBoss使用的是log4j,JBoss的系统日志级别默认是INFO.而Hibernate或IBatis要打印SQL,级别为DEBUG,所以,程序设置了log4j级别为DEBUG会被JBoss系统 ...
- 灵活控制 Hibernate 的日志或 SQL 输出(包含参数),以便于诊断
首先参考:http://blog.csdn.net/zljjava/article/details/7534349 [灵活控制 Hibernate 的日志或 SQL 输出,以便于诊断] 我的具体配置 ...
- Hibernate原生SQL查询
最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...
- Hibernate:SQL查询 addScalar()或addEntity()
Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该 ...
随机推荐
- TTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
解决办法一: 控制面板->打开或关闭windows功能->Internet信息服务->万维网服务->应用程序开发功能. 勾选上“.net扩展性”和“ASP.NET”,保存后,重 ...
- pureMVC简单示例及其原理讲解四(Controller层)
本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...
- JavaScript中DOM的层次节点(一)
DOM是针对HTML和XML文档的一个API,描绘了一个层次化的节点树,允许开发人员添加.修改.删除节点的一部分. DOM将HTML和XML文档描绘成一个有多个节点构成的结构,节点分为12种不同的节点 ...
- 为什么我最终替换掉了NATS
之前公司没有使用msmq/rebbitmq等消息队列,一方面是觉得太重,想避免在引入中间件.另外的原因是公司的业务并不需要消息持久化和确保可送达(at-least-once VS at-more-on ...
- SQLite:自学笔记(1)——快速入门
SQLite的安装和入门 了解 啥是SQLite? SQLite是一种轻巧迷你的关系型数据库管理系统.它的特点如下: 不需要一个单独的服务器进程或操作的系统(无服务器的). SQLite 不需要配置, ...
- Linux Platform驱动模型(一)-设备信息
我在Linux字符设备驱动框架一文中简单介绍了Linux字符设备编程模型,在那个模型中,只要应用程序open()了相应的设备文件,就可以使用ioctl通过驱动程序来控制我们的硬件,这种模型直观,但是从 ...
- Wireshark网络抓包(三)——网络协议
一.ARP协议 ARP(Address Resolution Protocol)地址解析协议,将IP地址解析成MAC地址. IP地址在OSI模型第三层,MAC地址在OSI第二层,彼此不直接通信: 在通 ...
- 蓝桥网试题 java 基础练习 十六进制转八进制
- -------------------------------------------------------------------------------------------------- ...
- Biztalk AS2开发经验总结
一. 准备证书 4 1. 升级win2008 R2证书服务 4 2. 申请证书 6 二. 配置证书 13 1. 为AS2配置证书 13 2. ...
- 真机测试错误“The application could not be verified”
真机测试错误"The application could not be verified" 真机测试的时候报错:"The application could not be ...