`
梅花灿
  • 浏览: 6070 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Hibernate Projections(投影、统计、不重复结果)

阅读更多

 

Hibernate除了处理查询结果集中的对象之外,还可以将结果集中的结果当做行和列集来使用,这与通过JDBC执行select查询获得的数据的使用方式相似。因此,Hibernate也支持属性、统计函数和Group By等查询。

要想使用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,其中依次包含所有的统计投影结果。

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

 

  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. criteria.addOrder(Order.asc("orderSign")); 
  7. list = criteria.list(); 
  8. getSession().getTransaction().commit(); 

最后,可以使用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 criteria基本操作

    Hibernate Criteria 支持多种比较操作,例如 `eq`(等于)、`ne`(不等于)、`gt`(大于)、`lt`(小于)、`ge`(大于等于)和 `le`(小于等于)。例如: ```java criteria.add(Restrictions.eq("name", "刘伟"))...

    连续投影算法,连续投影算法原理,matlab

    连续投影算法(Sequential Projection Algorithm, SPA)是一种在光谱数据分析中广泛应用的技术,主要用于特征波段的选择,以提高光谱建模的效率和准确性。在遥感、化学分析、医学成像等多个领域,光谱特征的提取是至...

    传智播客hibernate源码

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

    传智播客_hibernate

    5. **Criteria API的Projections**: 用于结果集的投影,例如获取平均值、计数等。 **四、事务管理** 1. **Transaction**: Hibernate提供了Transaction接口,用于管理数据库事务,确保数据的一致性。 2. **自动...

    ClickHouse Projections, ETL and more.pdf

    在"ClickHouse Projections, ETL and more.pdf"这份资料中,主要讨论了ClickHouse的几个核心特性,包括投影(Projections)、ETL过程以及其他的改进,并对未来的展望进行了探讨。 1. **投影(Projections)**: ...

    hibernate 执行原生sql的几种方式

    虽然`Criteria API`主要是为了使用Hibernate的ORM功能,但也可以通过`Projections.sqlProjection()`执行原生SQL投影,从而创建自定义的查询。 ```java Criteria criteria = session.createCriteria(User.class); ...

    hibernate criteria 分组 排序 关联

    // 计算年龄字段不为空且不重复的记录数量 List<Long> countDistinctAge = criteria.list(); ``` - **最大值(Max)**: ```java Criteria criteria = session.createCriteria(User.class); criteria....

    \Hibernate_query条件查询

    投影用于获取特定列,而聚合函数(如COUNT, SUM, AVG等)用于统计。例如: ```java // HQL query = session.createQuery("select count(u) from User u"); // Criteria ProjectionList projections = ...

    CT 滤波反投影重建 直接反投影重建

    投影算法调用matlab系统函数 [R,xp] = radon(I,theta);...适合CT重建算法初学者调试学习,直观了解不同算法,不同投影个数引起的不同结果。 phantom 为一个圆形。 是我在CMU的一次课程作业,含源码和文档。

    Hibernate Criteria用法大全.docx

    可以使用`Projections`来获取预测(如计数、最大值等)和聚合(如求和、平均值)结果,例如: ```java ProjectionList projections = Projections.projectionList(); projections.add(Projections.count("id"), ...

    hibernate中文参考文档pdf

    这本参考手册全面覆盖了Hibernate 3.6.10的关键特性和用法,是Java开发者深入理解和应用Hibernate不可或缺的参考资料。通过阅读和实践,开发者可以掌握如何利用Hibernate简化数据访问层的开发,提升项目效率。

    Understanding_Map_Projections

    根据提供的文件信息,我们将详细探讨地图投影的相关知识点,这些信息主要来源于标题“Understanding Map Projections”和描述中的内容,以及部分内容的片段。 首先,从标题“Understanding Map Projections”中,...

    Hibernate的Criteria用法总结

    Criteria用于在线查询,直接与Hibernate Session关联,而DetachedCriteria则可在不依赖Session的情况下创建,适用于离线或延迟执行的查询。DetachedCriteria可以通过`forClass(Class)`或`forEntityName(String)`静态...

    hibernate 3.5.5 常用jar包

    11. **Criteria API中的Projections**:用于定义查询结果的返回类型,如sum、avg、count等。 12. **SessionFactory**:是线程安全的,负责创建Session实例,一般在应用启动时初始化一次。 13. **第二级缓存**:...

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

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的方式,从而提高开发效率。本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的...

    局部保持投影原文及matlab代码

    局部保持投影(Locality Preserving Projections,LPP)是一种非线性降维技术,它在数据挖掘、机器学习和模式识别领域具有广泛的应用。LPP 的主要目标是保留数据集中的局部结构,在低维空间中保持高维数据点之间的...

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

    在Java的持久化框架中,Hibernate是一个非常重要的工具,它提供了ORM(对象关系映射)功能,使得开发者能够更方便地操作数据库。本篇将详细讲解如何使用Hibernate进行查询,特别是针对数据表中的一个特定字段。 一...

Global site tag (gtag.js) - Google Analytics