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();
时间: 2024-11-05 18:45:53

Hibernate Projections(投影、统计、不重复结果)的相关文章

poj 1952 BUY LOW, BUY LOWER 最长下降子序列+统计不重复方案数

dp[i]=max(dp[i],dp[j]+1) j<i且a[j]>a[i] dp[i]表示长度为i的最长下降子序列的长度. r[i]表示长度为i的最长下降子序列的方案数. 考虑这样一个问题,比如6 3 9 3,对于两个3,他们数字一样并且dp值也一样,那么r[2]的方案数是没有意义的 因为能通过第一个3扩展的也能通过第二个3扩展,所以直接把r[2]=0. 对于一次扩展若dp[j]+1==dp[i],则说明j的路线和i的路线都可以用则r[i]+=r[j] 若dp[j]+1>dp[i],则

使用awk统计字段重复实践

awk awk是一种规格化文件的分析工具, 主要处理对象类似数据库导出的条目文本文件, 其中一行,就对应一个记录,每个记录包含若干个字段. 类似这种文本: [[email protected] ~]# last -n 5 <==仅取出前五行 root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41) root pts/1 19

mongodb 分组查询统计去掉重复的记录

mongodb版本号是,MongoDB shell version: 2.4.4 操作环境,shell窗口 ,如下所示: [mongo_user@mongodb_dbs ~]# mongo --port 30100 MongoDB shell version: 2.4.4 connecting to: 127.0.0.1:30000/test mongos> mongos> use pos switched to db pos mongos> 1,先统计分组记录数,以paymentOrd

EasyUI+SpringMVC+Hibernate 日期区间查询统计

图书借阅管理系统,统计书籍借阅情况,可查询历史借阅排行和分类排行,默认返回前30名.查询时用sql jsp,这里用到了easyui-datebox,用formatter和parser对日期格式进行转换,转换成YYYY-MM-DD 的格式,后台直接是String接受 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

EXCEL统计不重复值的数量

如这一列中,有多少不重复值? 1.可以点击,数据,删除重复项,清除重复值,然后剩下的统计一下即可知道:       ===> 2.用公式:=SUMPRODUCT((MATCH(E3:E20,E3:E20,0)=ROW(E3:E20)-ROW(E3)+1)*1) 其中,E3到E20是要统计的范围i,E3开始,E20结束. 这个公式的意思是,从E3到E20遍历,分别查询当前值在列表中的位置(MATCH函数),并与 当前行号相比(因数据不是从第一行开始,需要修正行号),如果相等则累加(1),否则累加(

Hibernate工具类_抽取重复核心代码

问题:在Hibernate中每次执行一次操作总是需要加载核心配置文件,获取连接池等等都是重复动作,所以抽取出来 解决: package com.xxx.utils; /** *Hibernate的工具类 *@author cxh */ import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg

如何统计文件重复率

假设某个目录下有N个文件夹,每个文件夹下是某个人的项目代码,一个人一个文件夹,代码有可能文件名不同,但内容可能相同 程序执行时,通过指定路径,分析出某个人和其他人的重复率,如: 被比较者姓名    比较者姓名1   重复率 张三                   李四               90 张三                   王五               30 重复率是所有文件比较完成后,每个文件的重复率平均值,在分析的过程中,要有分析的过程情况,如: *********

awk过滤统计不重复的行

awk以‘\t’为分隔符区分列 cat logs | grep IconsendRedirect | grep 1752 | awk -F'\t' '{print $8}'| wc -l cat hello.txt | awk '!a[$0]++' | wc -l

hibernate的Criteria条件查询

项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来 1.初解 快速浏览了资料,大致了解了以下的内容: 1. Hibernate 定义了CriteriaSpecification接口规范用来完成面向对象的条件查询,Criteria 和 DetachedCriteria 就是CriteriaSpecification的子接口. 2. Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样,Criteria 是在线