在<想看Hibernate生成的SQL语句?>里,我列出怎么来看Hibernate生成sql的方法, 在末尾留了一个小尾巴,今天把它补上.
程序中的实际场景是这样的, 一个Model类里有contractBw,nodeType,subCompany,overBw等属性, 现在要对contractBw和overBw有三次汇总求和并显示记录条数,分别是按contractBw,nodeType,subCompany来 group by.
这样在程序中用Projections来做, 有了以下的代码:
projList.add(Projections.rowCount(),"rowCount");
projList.add(Projections.sum("contractBw"),"contractBw");
projList.add(Projections.sum("overBw"),"overBw");
projList.add(Projections.groupProperty(groupItem),groupItem);
queryCirteria.setProjection(projList);
queryCirteria.setResultTransformer(new AliasToEntityMapResultTransformer());
这里的参数groupItem上层代码可以设定为"contractBw","nodeType", "subCompany",从而达到三次求和可以共用这上面的代码.
这样写,猛一看没什么问题, 也能跑的通.
但看页面上的数据时发现问题了, 数据不对劲: 如果一个contractBw为2000M的记录有2条,sum出来和应该是4000M才对,可显示是2000M, 这是怎么回事?
是什么地方出问题了? 从哪下手? 这样的问题在网上也没法, 只能自己硬着头皮解决了. 幸好自己的IDE里配置了debug功能,于是就跟踪源码了, 胡乱地设置了几个断点后,没发现有什么价值的信息,不过看IDE里方法的调用栈,发现有这么一个preprocessSQL, 难道是与生成的SQL有关? 嘿嘿... 要是真是那样就好了, 可以用hibernate生成的代码在数据库里运行下,看看结果怎样.
于是在preprocessSQL方法sql = applyLocks( sql, parameters.getLockModes(), dialect );一句处设置了断点. 一运行,还真能看到生成的SQL, 拷到数据库里一执行, 乖乖, 没问题.....
电光火石间, 我意识到了:
projList.add(Projections.groupProperty(groupItem),groupItem);
这里出问题了.这里得另起名字,于是改成了
projList.add(Projections.groupProperty(groupItem),groupItem+"item");
现在想想,那种感觉太奇妙了!从看到hibernate生成的sql在数据库里执行结果显示出来到意识到问题的根源,感觉这期间不超过一秒钟!
这样改了后,再启动,没问题了:2000M的记录有2条,sum出来和也是4000M!
现在回过来头来看看, 是什么促使自己能在这么短的时间能发现并改正程序中的问题呢?在IDE中设置断点用hibernate生成的sql在数据库中执行起到了关键性的作用. 下一篇中将分析结合hibernate的执行过程分析下为什么这样改是正确的.
分享到:
相关推荐
GEE错误:Error: Projection: The CRS of a map projection could not be parsed. (Error code: 3) 我正在尝试在 Albers 等积投影 ( https://code.earthengine.google.com/ccab6721def78c24dc2a0e079866a6fe ) 中...
5. **创建VirtualDisplay**:有了`MediaProjection`对象,我们可以创建一个`VirtualDisplay`,它会把屏幕内容显示到我们的`ImageReader`上。`ImageReader`是用于接收屏幕截图的Surface。 ```java ImageReader ...
通过深入研究《Hibernate Quickly 源代码》,开发者可以全面掌握Hibernate框架的使用,提高开发效率,同时也能了解到实际项目中如何解决常见的持久化问题。这是一份非常有价值的资源,对于想要提升Java数据库编程...
Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,从而简化了Java数据库编程。本文档是中文版,方便中国开发者更好地理解和应用Hibernate。 1. **对象关系映射(ORM)...
其次,在数据库设计中,"Projection"指的是关系代数操作之一,它从一个关系中选择出若干列,形成一个新的关系。例如,从包含多列的员工表中选取员工姓名和薪水,形成一个新的简化表。这一操作是SQL查询中的SELECT...
2. **实体(Entity)**:在Hibernate中,实体代表数据库中的表,通常是一个Java类,通过`@Entity`注解标识。实体类的属性对应表的列,可以通过`@Id`注解定义主键。 3. **持久化类(Persistent Class)**:持久化类...
在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务。"Hibernate-基础联表模板"是针对Hibernate中联表查询的一个实用...
- **配置 Hibernate**: 需要创建一个配置文件(通常是 `hibernate.cfg.xml`),设置数据库连接参数、实体类扫描路径等。 - **映射文件**: 编写 `.hbm.xml` 文件或使用注解(推荐)将 Java 类与数据库表关联。 - **...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象操作,从而简化数据库编程。在Java应用中,Hibernate 提供了一种便捷的方式,将数据库中的数据与Java对象进行绑定,避免了...
如果你希望在配置文件中预定义一个原生SQL查询,可以使用`@NamedNativeQuery`注解。这使得代码更加整洁,易于管理。 ```java @Entity @Table(name = "User") @NamedNativeQuery( name = "User.findAll", ...
在Android系统中,从5.0(API级别21)开始,引入了一个名为MediaProjection的框架,使得开发者能够实现屏幕录制的功能。MediaProjection是Android提供的一种API,它允许应用程序捕获设备屏幕的内容,并将其保存为...
在GIS(地理信息系统)领域,地图投影是一种将三维地球表面转换为二维平面的数学方法。投影的选择至关重要,因为它直接影响到地图的准确性、形状、面积和方向。本项目以"projection"为标题,显然关注的是地图投影...
"Gradient Projection for Sparse Reconstruction"(GPSR)正是这样一个专门用于解决此类问题的工具包。它基于梯度投影算法,旨在高效地恢复数据的稀疏表示,从而实现信号的准确重构。 稀疏重建的核心思想是利用...
总结来说,3DMAX几何投影插件Geometry Projection是一个高效且灵活的工具,它简化了3D建模中的对齐和复制过程,特别是在处理多个对象和复杂形状时,能够显著提高工作质量和效率。通过熟练掌握并运用这个插件,3D艺术...
Hibernate是Java平台上的一个开源ORM框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务。5.2.3.Final是Hibernate的一个稳定版本,包含了多项改进和新特性。 2. Hibernate安装与配置: ...
《Hibernate 3.6.7.Final 中文帮助文档》是一个非常重要的资源,它为学习和使用Hibernate框架的中文用户提供详尽的指南。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而...
- 在Hibernate中,每个Java类对应数据库中的一个表,类的实例对应表的记录。 - 使用注解或者XML文件来定义实体类与表之间的映射关系,如@Table、@Column等。 4. **Session与Transaction** - Session是Hibernate...
Example 的创建有所不同,Example 本身提供了一个静态方法 `create(Object entity)`, 即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件,如 `ignoreCase()` 和 `enableLike...
Example 的创建有所不同,Example 本身提供了一个静态方法 create(Object entity),即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件:Example exampleUser = Example.create...