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):计算属性值的总和。
下面的示例演示了一些统计函数和投影列表的使用方法:
- getSession().beginTransaction();
- Criteria Crit = getSession().createCriteria(Product.class);
- ProjectionList projList = Projections.projectionList();
- projList.add(Projections.max("price"));
- projList.add(Projections.min("price"));
- projList.add(Projections.avg("price"));
- projList.add(Projections.countDistinct("description"));
- Crit.setProjection(projList);
- List result = Crit.list();
- getSession().getTransaction().commit();
上述示例执行了多个统计投影。当执行多个统计投影时,会获取一个List,并且是一个Object类型的List,其中依次包含所有的统计投影结果。
使用投影的一个好处就是,获得的结果是单独的属性而不是实体类。例如,一个产品表中包含有很多字段,我们想要获取产品表中的名称和描述,而不需要将完整的实体加载到内存中。
- Criteria Crit = getSession().createCriteria(Product.class);
- ProjectionList projList = Projections.projectionList();
- projList.add(Projections.property("name"));
- projList.add(Projections.property("description"));
- Crit.setProjection(projList);
- List result = Crit.list();
使用这种查询风格可以减少应用服务器和数据库服务器之间的网络通信量。但是,如果客户机的内存容量的确是有限的,那么这种查询方式可以避免处理大型数据集对内存的压力。如果不确定以后是否需要一个完整的结果集,这得要执行另外一次查询,反而降低了查询性能。所以只能在适当的时候才使用Hibernate的投影功能。
那么如何获得结果集中的不重复的结果呢?方法为:
distinct(Projection proj):统计属性的不重复值。
- getSession().beginTransaction();
- Criteria criteria = getSession().createCriteria(Transaction.class);
- ProjectionList proList = Projections.projectionList();
- proList.add(Projections.distinct(Projections.property("module")));
- criteria.setProjection(proList);
- criteria.addOrder(Order.asc("orderSign"));
- list = criteria.list();
- getSession().getTransaction().commit();
最后,可以使用groupProperty投影对结果集进行分组(使用SQL的GROUP BY子句)。下面的示例安装名称和价格对产品进行分组:
- Criteria Crit = getSession().createCriteria(Product.class);
- ProjectionList projList = Projections.projectionList();
- projList.add(Projections.groupProperty("name"));
- projList.add(Projections.groupProperty("price"));
- Crit.setProjection(projList);
- List result = Crit.list();
- 点赞
- 收藏
- 分享
- 文章举报
- Hibernate Projections(投影、统计、不重复结果)
- Hibernate Projections(投影、统计、不重复结果)
- Hibernate Projections(投影、统计、不重复结果)
- Hibernate Projections(投影、统计、不重复结果)
- Hibernate Projections(投影、统计、不重复结果)
- Hibernate Projections(投影、统计、不重复结果)
- Hibernate Projections(投影、统计、不重复结果)[转]
- Hibernate的list()方法出来的结果重复
- hibernate一对多查询结果重复解决方法
- hibernate的统计结果排序Order
- hibernate的统计结果排序Order
- 统计重复字符串 如 eeefffkkkhjk 得到如下结果 3e3f3khjk;
- SQL语句-统计全部数据,过滤掉其中两个字段同时重复的记录
- Hibernate HQL分页时下一页和本页数据重复的解决
- 在Struts2下使用[拦截器]配合[session监听器]实现在线会员统计与防止重复登录
- 使用p6spy让hibernate打印真正的sql 去掉结果集resultset版.
- Excel 统计符合条件不重复的个数
- 问题:oracle DECLARE 变量重复利用;结果:Oracle 定义变量总结
- 重复调用ab命令的shell代码和整理ab结果的java代码
- 将查询的行转成列, 还有将查询的结果进去对比日期统计 (附SQLMap的源码)