本文是我在importNew翻译的文章,首发在importNew,这里会定期更新链接

为什么有时Hibernate会在程序某一部分生成一条指定sql查询?这个问题让人非常难立马理解。当处理不是我们本人编写的代码时更是如此。

本文将展示怎样配置来产生Hibernate查询操作的日志。通过这些日志和一些小技巧来找出这些指定的查询为什么及在何处被运行。

Hibernate查询日志格式

Hibernate内建的查询日志格式例如以下:

select /* load your.package.Employee */ this_.code, ...
from employee this_
where this_.employee_id=? TRACE 12-04-2014@16:06:02 BasicBinder - binding parameter [1] as [NUMBER] - 1000

为什么Hibernate不能记载终于的查询日志?

须要注意的是。Hibernate仅仅记录从它发送到JDBC的准备语句(prepared statement)及參数。准备语句使用“?”作为查询參数的占位符,这些參数的实际值被记录在准备语句的下方。

这些准备语句和终于发送到数据库的sql语句是不同的,对于这些终于的查询操作Hibernate无法记录。

出现这样的情况的原因是Hibernate仅仅知道它发送给JDBC的准备语句和參数,实际的查询是由JDBC构建并发送给数据库的。

为了产生实际查询的日志。像log4jdbc这样的工具是不可缺少的,这里不会讨论怎样使用log4jdbc。

怎样找到原始查询操作

上述的可记录查询包括一条标注,在大多数情况下它能够标识某条起始查询语句。

假设一条查询是由载入引起的,那么标注便是/*load your.entity.Name*/。

假设是一条命名查询。那么标注则包括查询的名称。

假设它是一个相应很多延迟载入的查询,标注则会包括相应类的名称和引发该操作的属性值等。

设置Hibernate的查询日志

为了获得查询日志,须要将例如以下标签增加会话工厂的配置文件里:

<bean id= "entityManagerFactory" >
...
<property name="jpaProperties" >
<props>
<prop key="hibernate.show_sql" >true</ prop>
<prop key="hibernate.format_sql" >true</ prop>
<prop key="hibernate.use_sql_comments">true</prop>
</props>
</property>

上面的演示样例展示了Spring实体管理工厂的配置。以下是对一些标签的解释:

  • show_sql:激活查询日志功能。
  • format_sql:优雅地输出Sql。
  • use_sql_comments:加入一条解释型标注。

为了记录查询语句的參数信息,log4j或者相相应的信息是须要的。

<logger name="org.hibernate.type">
<level value="trace" />
</logger >

假设上述功能都不能执行

在大多数情况下。use_sql_comments创建的标注是足够用来标识查询的起始。但假设这还不够,我们能够标识和数据表名相关联的查询返回的实体,并在返回的实体构造函数中设置断点。

假设一个实体没有构造函数,我们能够创建一个构造函数并把断点设置在super()函数调用中。

@Entity
public class Employee {
public Employee() {
super(); // put the breakpoint here
}
...
}

设置断点后,跳转到包括程序堆栈信息的Debug界面并从头到尾运行一遍。这样在调用栈中将会出现查询操作在何处被创建。

Hibernate调试——定位查询源头的更多相关文章

  1. hibernate框架之-查询结果集返回类型

    Hibernate支持HQL和SQL的查询,返回结果支持POJO类型或字段/数组的形式. 开发中用Hibernate进行数据库查询,用的是SQL.原来需要查询一个表的几乎所有字段,所以我使用了addE ...

  2. Hibernate原生SQL查询

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

  3. hibernate的hql查询

    1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...

  4. Hibernate原生SQL查询多表关联,SQL语句要注意的问题

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

  5. hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)

    hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...

  6. thinkphp 定位查询 Model:last您所请求的方法不存在!

    thinkphp 定位查询 Model:last您所请求的方法不存在!   用thinkphp3.1做项目的时候为了获取记录表中最后一个id用到了last()方法,出现了这个错误:Model:last ...

  7. Hibernate之HQL查询

    一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...

  8. Hibernate应用SQL查询返回实体类型

    Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...

  9. Hibernate五 HQL查询

    HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...

随机推荐

  1. Hydux: 一个 Elm-like 的 全功能的 Redux 替代品

    在学习和使用 Fable + Elmish 一段时间之后,对 Elm 架构有了更具体的了解, 和预料中的一样,Redux 这种来自 Elm 的风格果然还是和强类型的 Meta Language 语言更 ...

  2. day03_04 文件后缀及系统环境变量

    进入cmd,如果想直接切换盘符的话,操作如下 dir命令---查看目录下的文件及文件夹 cd命令---想进入某个目录,就是是双击文件夹进入目录的命令,按table键有神奇效果哦 cd ..命令---类 ...

  3. Event based Collections

    https://sourceforge.net/p/happy-guys/wiki/Event%20based%20Collections/

  4. 【Luogu】P3979遥远的国度(树链剖分)

    题目链接 不会换根从暑假开始就困扰我了……拖到现在…… 会了还是很激动的. 换根操作事实上不需要(也不能)改树剖本来的dfs序……只是在query上动动手脚…… 设全树的集合为G,以root为根,u在 ...

  5. 移动端可拖动导航菜单小demo

    <!DOCTYPE html> <html lang="en"> <head> <title>移动端滑动导航菜单</title ...

  6. NOJ——1559Jump to the Top of Mountain(简单暴力DFS+渣渣代码)

    [1559] Jump to the Top of Mountain 时间限制: 1000 ms 内存限制: 65535 K 问题描述 Have you played a game named Min ...

  7. 刷题总结——开车旅行(NOIP2012 set+倍增)

    题目: 题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城 ...

  8. Atcoder CODE FESTIVAL 2017 qual B D - 101 to 010 dp

    题目链接 题意 对于一个\(01\)串,如果其中存在子串\(101\),则可以将它变成\(010\). 问最多能进行多少次这样的操作. 思路 官方题解 转化 倒过来考虑. 考虑,最终得到的串中的\(' ...

  9. 快充 IC BQ25896 如何判斷 手機插著 adapter 充電器時,adapter Iout 大於限制,adapter Vout 小於 限制,導致 battery 不但沒充電且還需放電。

    若電池在 放電時,ICHGR 為0. 若電池在 充電時,ICHGR有變化.   下面有寫到 charge current 所以不是 discharge current   狀況:           ...

  10. Scrapy学习-17-暂停和重启

    Scrapy爬虫暂停和重启 在当前项目下新建一个用于存储中间过程变量的目录 注意不同的spider不能共用一个目录 同一个spider每次运行时也必须使用新的目录 mkdir <spider_p ...