`

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

 
阅读更多

/*ProjectionList list = Projections.projectionList();
Projection projection = Projections.rowCount();
Projection projection2 = Projections.property("name");
list.add(projection);
list.add(projection2);
criteria.setProjection(list);*/

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();

createAlias
给表取表名。
public Criteria createAlias(String associationPath,
                            String alias,
                            int joinType)
The joinType is expected to be one of CriteriaSpecification.INNER_JOIN (the default), CriteriaSpecification.FULL_JOIN, or CriteriaSpecification.LEFT_JOIN
public Criteria createAlias(String associationPath,
                            String alias)
分享到:
评论

相关推荐

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

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

    Understanding_Map_Projections

    Understanding_Map_Projections ESRI ArcGIS 理解地图投影 经典书

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

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

    Hibernate+中文文档

    15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) 15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1....

    Locality Preserving Projections

    Locality Preserving Projections代码

    hibernate3.2中文文档(chm格式)

    15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) 15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1....

    HibernateAPI中文版.chm

    15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) 15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1....

    Hibernate中Criteria的完整用法

    其中 SimpleProjection 和 ProjectionList 的实例化是由内建的 Projections 来完成,如提供的 avg、count、max、min、sum 可以让开发者很容易对某个字段进行统计查询。 Property 是对某个字段进行查询条件的设置,...

    ClickHouse Projections, ETL and more.pdf

    ClickHouse Projections, ETL and more.pdf

    Map Projections-A Working Manual

    Map Projections-A Working Manual

    nn-iterated-projections, 基于迭代投影的神经网络训练.zip

    nn-iterated-projections, 基于迭代投影的神经网络训练 基于迭代投影算法的训练神经网络Jesse Clark 7 2017年01月以前,我曾经是相位检索( PR ) 领域的物理学家。 关于( 通常在傅立叶空间中)的幅值和实际空间( 像...

    Hibernate 中文 html 帮助文档

    15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) 15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量...

    Hibernate中文详细学习文档

    15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) 15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1....

Global site tag (gtag.js) - Google Analytics