hibernate的Projections用法

hibernate对统计分析操作行为做了封装,通过Projections对统计行为进行操作(投影、统计、不重复结果)

要想使用Hibernate的投影统计功能,首先要从org.hibernate.criterion.Projections工厂类获得org.hibernate.criterion.Projection对象。与Restrictions类相似,Projections类提供了几个用来获取Projection实例的静态工厂方法。在获得Projection对象之后,使用setProjection()方法将它添加到Criteria对象中。注意,返回的结果集是Object类型,需要对结果进行适当的类型转换。
例如:
//distinct
DetachedCriteria dc = this.createDetachedCriteria();
		dc.add(Restrictions.eq(type, type));
dc.setProjection(Projections.distinct(Projections.property("label")));//排除重复
Hibernate的Projections工厂类包含了以下几个常用的统计函数:
① avg(String propertyName):计算属性字段的平均值。
② count(String propertyName):统计一个属性在结果中出现的次数。
③ countDistinct(String propertyName):统计属性包含的不重复值的数量。
④ max(String propertyName):计算属性值的最大值。
⑤ min(String propertyName):计算属性值的最小值。
⑥ sum(String propertyName):计算属性值的总和。

投影操作时,当执行多个统计投影时,会获取一个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的投影功能。
使用group by
Criteria Crit = getSession().createCriteria(Product.class); 
ProjectionList projList = Projections.projectionList(); 
projList.add(Projections.groupProperty("name")); 
projList.add(Projections.groupProperty("price")); 

你可能感兴趣的:(Hibernate)