`

在hibernate里用Projection里的一个问题及其解决

阅读更多

     在<想看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的执行过程分析下为什么这样改是正确的.

2
1
分享到:
评论

相关推荐

    GEE Projection The CRS of a map projection could not be parsed

    GEE错误:Error: Projection: The CRS of a map projection could not be parsed. (Error code: 3) 我正在尝试在 Albers 等积投影 ( https://code.earthengine.google.com/ccab6721def78c24dc2a0e079866a6fe ) 中...

    MediaProjection实现截屏

    5. **创建VirtualDisplay**:有了`MediaProjection`对象,我们可以创建一个`VirtualDisplay`,它会把屏幕内容显示到我们的`ImageReader`上。`ImageReader`是用于接收屏幕截图的Surface。 ```java ImageReader ...

    Hibernate Quickly 源代码

    通过深入研究《Hibernate Quickly 源代码》,开发者可以全面掌握Hibernate框架的使用,提高开发效率,同时也能了解到实际项目中如何解决常见的持久化问题。这是一份非常有价值的资源,对于想要提升Java数据库编程...

    hibernate3.3.2中文帮助文档

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,从而简化了Java数据库编程。本文档是中文版,方便中国开发者更好地理解和应用Hibernate。 1. **对象关系映射(ORM)...

    Projection

    其次,在数据库设计中,"Projection"指的是关系代数操作之一,它从一个关系中选择出若干列,形成一个新的关系。例如,从包含多列的员工表中选取员工姓名和薪水,形成一个新的简化表。这一操作是SQL查询中的SELECT...

    HIBERNATE官方参考手册

    2. **实体(Entity)**:在Hibernate中,实体代表数据库中的表,通常是一个Java类,通过`@Entity`注解标识。实体类的属性对应表的列,可以通过`@Id`注解定义主键。 3. **持久化类(Persistent Class)**:持久化类...

    Hibernate-基础联表模板

    在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务。"Hibernate-基础联表模板"是针对Hibernate中联表查询的一个实用...

    hibernate开发包

    - **配置 Hibernate**: 需要创建一个配置文件(通常是 `hibernate.cfg.xml`),设置数据库连接参数、实体类扫描路径等。 - **映射文件**: 编写 `.hbm.xml` 文件或使用注解(推荐)将 Java 类与数据库表关联。 - **...

    hibernate官网jar包

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象操作,从而简化数据库编程。在Java应用中,Hibernate 提供了一种便捷的方式,将数据库中的数据与Java对象进行绑定,避免了...

    hibernate 执行原生sql的几种方式

    如果你希望在配置文件中预定义一个原生SQL查询,可以使用`@NamedNativeQuery`注解。这使得代码更加整洁,易于管理。 ```java @Entity @Table(name = "User") @NamedNativeQuery( name = "User.findAll", ...

    MediaProjection实现录屏

    在Android系统中,从5.0(API级别21)开始,引入了一个名为MediaProjection的框架,使得开发者能够实现屏幕录制的功能。MediaProjection是Android提供的一种API,它允许应用程序捕获设备屏幕的内容,并将其保存为...

    projection

    在GIS(地理信息系统)领域,地图投影是一种将三维地球表面转换为二维平面的数学方法。投影的选择至关重要,因为它直接影响到地图的准确性、形状、面积和方向。本项目以"projection"为标题,显然关注的是地图投影...

    Gradient Projection for Sparse Reconstruction

    "Gradient Projection for Sparse Reconstruction"(GPSR)正是这样一个专门用于解决此类问题的工具包。它基于梯度投影算法,旨在高效地恢复数据的稀疏表示,从而实现信号的准确重构。 稀疏重建的核心思想是利用...

    3DMAX几何投影插件Geometry Projection

    总结来说,3DMAX几何投影插件Geometry Projection是一个高效且灵活的工具,它简化了3D建模中的对齐和复制过程,特别是在处理多个对象和复杂形状时,能够显著提高工作质量和效率。通过熟练掌握并运用这个插件,3D艺术...

    hibernate-release-5.2.3.Final

    Hibernate是Java平台上的一个开源ORM框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务。5.2.3.Final是Hibernate的一个稳定版本,包含了多项改进和新特性。 2. Hibernate安装与配置: ...

    hibernate-3.6.7.final中文帮助文档(html)

    《Hibernate 3.6.7.Final 中文帮助文档》是一个非常重要的资源,它为学习和使用Hibernate框架的中文用户提供详尽的指南。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而...

    Hibernate手把手教学

    - 在Hibernate中,每个Java类对应数据库中的一个表,类的实例对应表的记录。 - 使用注解或者XML文件来定义实体类与表之间的映射关系,如@Table、@Column等。 4. **Session与Transaction** - Session是Hibernate...

    Hibernate - DetachedCriteria 的完整用法

    Example 的创建有所不同,Example 本身提供了一个静态方法 `create(Object entity)`, 即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件,如 `ignoreCase()` 和 `enableLike...

    Hibernate中Criteria的完整用法

    Example 的创建有所不同,Example 本身提供了一个静态方法 create(Object entity),即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件:Example exampleUser = Example.create...

Global site tag (gtag.js) - Google Analytics