`

Hibernate 查询 Projections 类使用 (一)

 
阅读更多

     Hibernate也支持属性、统计函数和Group By等查询。

 

(1)要想使用Hibernate的投影统计功能,首先要从org.hibernate.criterion.Projections工厂类获得org.hibernate.criterion.Projection对象。与Restrictions类相似,Projections类提供了几个用来获取Projection实例的静态工厂方法。在获得Projection对象之后,使用setProjection()方法将它添加到Criteria对象中。注意,返回的结果集是Object类型,需要对结果进行适当的类型转换。

Hibernate的Projections工厂类包含了以下几个常用的统计函数:

① avg(String propertyName):计算属性字段的平均值。

② count(String propertyName):统计一个属性在结果中出现的次数。

③ countDistinct(String propertyName):统计属性包含的不重复值的数量。

④ max(String propertyName):计算属性值的最大值。

⑤ min(String propertyName):计算属性值的最小值。

⑥ sum(String propertyName):计算属性值的总和。

下面的示例演示了一些统计函数和投影列表的使用方法:

  1. getSession().beginTransaction(); 
  2. Criteria Crit = getSession().createCriteria(Product.class); 
  3. ProjectionList projList = Projections.projectionList(); 
  4. projList.add(Projections.max("price")); 
  5. projList.add(Projections.min("price")); 
  6. projList.add(Projections.avg("price")); 
  7. projList.add(Projections.countDistinct("description")); 
  8. Crit.setProjection(projList); 
  9. List result = Crit.list(); 
  10. getSession().getTransaction().commit(); 

上述示例执行了多个统计投影。当执行多个统计投影时,会获取一个List,并且是一个Object类型的List,其中依次包含所有的统计投影结果。

 

(2)使用投影的一个好处就是,获得的结果是单独的属性而不是实体类。例如,一个产品表中包含有很多字段,我们想要获取产品表中的名称和描述,而不需要将完整的实体加载到内存中。

  1. Criteria Crit = getSession().createCriteria(Product.class); 
  2. ProjectionList projList = Projections.projectionList(); 
  3. projList.add(Projections.property("name")); 
  4. projList.add(Projections.property("description")); 
  5. Crit.setProjection(projList); 
  6. List result = Crit.list(); 

使用这种查询风格可以减少应用服务器和数据库服务器之间的网络通信量。但是,如果客户机的内存容量的确是有限的,那么这种查询方式可以避免处理大型数据集对内存的压力。如果不确定以后是否需要一个完整的结果集,这得要执行另外一次查询,反而降低了查询性能。所以只能在适当的时候才使用Hibernate的投影功能。

那么如何获得结果集中的不重复的结果呢?方法为:

distinct(Projection proj):统计属性的不重复值。

  1. getSession().beginTransaction();  
  2. Criteria criteria = getSession().createCriteria(Transaction.class); 
  3. ProjectionList proList = Projections.projectionList();      
  4. proList.add(Projections.distinct(Projections.property("module"))); 
  5. criteria.setProjection(proList); 
  6.              
  7. criteria.addOrder(Order.asc("orderSign")); 
  8. list = criteria.list(); 
  9. getSession().getTransaction().commit(); 

(3)可以使用groupProperty投影对结果集进行分组(使用SQL的GROUP BY子句)。下面的示例安装名称和价格对产品进行分组:

  1. Criteria Crit = getSession().createCriteria(Product.class); 
  2. ProjectionList projList = Projections.projectionList(); 
  3. projList.add(Projections.groupProperty("name")); 
  4. projList.add(Projections.groupProperty("price")); 
  5. Crit.setProjection(projList); 
  6. List result = Crit.list();
分享到:
评论

相关推荐

    Hibernate_query查询数据表中的一个字段.

    本篇将详细讲解如何使用Hibernate进行查询,特别是针对数据表中的一个特定字段。 一、Hibernate简介 Hibernate是Java领域的一个开源ORM框架,它简化了数据库操作,通过映射Java类到数据库表,可以将数据库操作转化...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    Hibernate查询方式代码示例

    在`hibernate.cfg.xml`或实体类的`@NamedQuery`注解中定义命名查询: ```xml FROM Student WHERE age > 20 ``` 在代码中使用: ```java Query query = session.getNamedQuery("getStudentsOverAge"); ...

    hibernate里面的 两种查询

    Criteria API 是Hibernate提供的一种面向对象的查询方式,它允许开发者通过构建对象来表示查询条件,而不是直接编写SQL语句。这种查询方式更加符合面向对象编程的思想,降低了SQL语句的硬编码,提高了代码的可读性...

    Hibernate_query查询数据表中部分字段.

    本文将深入探讨如何使用Hibernate进行数据表中的部分字段查询,这在实际开发中是非常常见的需求。 首先,理解Hibernate的核心概念:实体(Entity)、持久化类(Persistent Class)和映射文件(Mapping File)。实体...

    Hibernate中Criteria的使用

    Hibernate 中 Criteria 的使用是 Hibernate 框架中的一种查询机制,对于研究 Hibernate 源码有一些作用。在查询方法设计上可以灵活地根据 Criteria 的特点来方便地进行查询条件的组装。 Criteria 是 Hibernate 中的...

    Hibernate中的查询:HQL、Criteria、原生SQl

    Criteria API是Hibernate提供的另一种查询方式,它提供了一种面向对象的查询接口,允许开发者动态构建查询。这种方法更加灵活,尤其在构建复杂的查询条件时。以下是一个简单的示例: ```java Session session = ...

    hibernate 进行多表查询每个表中各取几个字段

    在Hibernate中,多表查询通常涉及到关联关系的映射,包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。通过这些关联,我们可以实现JOIN操作来获取多个表的数据。 1. 关联...

    hibernate代码优化基于配置的多表查询

    可以使用`Projections`类来创建投影查询。 9. **数据库索引优化**: 对经常用于查询条件的字段添加数据库索引,可以加快查询速度。合理设计索引,避免全表扫描,对性能提升至关重要。 10. **实体状态管理**: ...

    很全面的Hibernate查询介绍

    关联查询:通过 `createCriteria()` 方法可以实现一对多、一对一、多对多等关联查询。例如,查询所有拥有项目的用户及其项目: ```java Criteria userCriteria = session.createCriteria(User.class, "user"); ...

    \Hibernate_query条件查询

    本篇将深入探讨Hibernate的条件查询,帮助开发者更好地理解和运用这一工具。 1. **HQL(Hibernate Query Language)** HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但操作的对象是对象而非表。例如,要...

    Hibernate QBC高级查询.rar

    1. **Criteria API**:它是Hibernate提供的一个API,允许开发者使用Java对象来构建查询。相比HQL,Criteria API更具有面向对象的特点,可以动态地构建查询条件,适应复杂的需求。 2. **DetachedCriteria**:这是一...

    传智播客hibernate源码

    11. **Criteria Projections**: 定义查询结果的投影,如计算平均值、求和等。 12. ** CascadeType**: 定义关联对象的级联操作,如删除一个对象时是否也删除其关联对象。 13. **懒加载(Lazy Loading)**: ...

    Hibernate中分页查询的封装。

    除了Criteria查询,还可以使用HQL(Hibernate Query Language)进行分页查询,HQL是Hibernate提供的面向对象的查询语言,语法类似SQL。以下是一个使用HQL分页查询的例子: ```java String hql = "from User"; Query...

    hibernate查询

    **一、Hibernate查询基础** 1. **实体映射**: 在Hibernate中,Java类被映射到数据库表,对象实例对应表中的记录。通过`@Entity`注解标记实体类,`@Table`指定对应的表名,`@Id`标识主键字段。 2. **Session接口**:...

    hibernate3使用手册

    《Hibernate3使用手册》是Java开发领域中一本重要的参考资料,主要涵盖了如何利用Hibernate3这个流行的持久化框架进行数据库操作的相关知识。Hibernate3作为Java对象关系映射(ORM)工具的代表,极大地简化了数据库...

    Hibernate Criteria 完全使用

    Hibernate Criteria API 是 Hibernate 框架中一个强大的查询工具,它提供了一种面向对象的方式来构建SQL查询,使得开发者无需直接编写SQL语句,即可进行复杂的数据库操作。Criteria API 提供了高度抽象的接口,可以...

    hibernate 3.5.5 常用jar包

    7. **查询语言(HQL)**:Hibernate Query Language是一种面向对象的查询语言,类似于SQL,但针对对象模型。 8. **Criteria查询**:另一种查询方式,提供API来构建动态查询,比HQL更灵活,且无需硬编码SQL。 9. **...

    Hibernate+中文文档

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    传智播客_hibernate

    3. **集合分页**: 使用Query的setFirstResult()和setMaxResults()方法实现分页查询,避免一次性加载大量数据。 通过以上讲解,我们可以看到,传智播客的Hibernate教程覆盖了从基础到进阶的各个方面,为初学者提供了...

Global site tag (gtag.js) - Google Analytics