本文是我在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. ThreeJs 基础入门

    本文来自网易云社区 作者:唐钊 Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它在 web 中创建各种三维场景,包括了摄影机.光影.材质等各种对象.使用它可以让我们更加直观的了解 we ...

  2. 大数据学习——sparkSql

    官网http://spark.apache.org/docs/1.6.2/sql-programming-guide.html val sc: SparkContext // An existing ...

  3. day01_03.人人都会编程

    PHP if语句打招呼编程 <?php$gender = "man"; if($gender == "man"){ echo "you are ...

  4. 缓存淘汰算法之FIFO

    前段时间去网易面试,被这个问题卡住,先做总结如下: 常用缓存淘汰算法 FIFO类:First In First Out,先进先出.判断被存储的时间,离目前最远的数据优先被淘汰. LRU类:Least ...

  5. C++程序在Windows平台上各种定位内存泄漏的方法,并对比了它们的优缺点

    一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...

  6. Etcd和ZooKeeper,究竟谁在watch的功能表现更好?

    ZooKeeper和Etcd的主要异同可以参考这篇文章,此外,Etcd的官网上也有对比表格(https://coreos.com/etcd/docs/latest/learning/why.html) ...

  7. [POJ1155]TELE

    [POJ1155]TELE 试题描述 A TV-network plans to broadcast an important football match. Their network of tra ...

  8. bzoj1076【SCOI2008】奖励关

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1076 有n种物品等概率落下,求期望最优收益 sol:  一眼看上去就是状压dp吧QAQ数据范围 ...

  9. C# IEnumerable to List 的转换

    一.使用Linq using System.Linq; Example: IEnumerable<, ); List<int> asList = enumerable.ToList( ...

  10. 两个VLC实现播放串流测试 (转)

    实现原理: 一个VLC打开视频文件发布串流(格式HTTP.RTP.RTSP等),另一个VLC打开串流播放 发布串流步骤: 1.菜单“媒体”->“流”,先添加视频文件.选择“串流”,如下图: 2. ...