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 Projections(投影、统计、不重复结果)的更多相关文章

  1. python统计元素重复次数

    python统计元素重复次数 # !/usr/bin/python3.4 # -*- coding: utf-8 -*- from collections import Counter arr = [ ...

  2. awk过滤统计不重复的行

    awk以‘\t’为分隔符区分列 cat logs | grep IconsendRedirect | grep 1752 | awk -F'\t' '{print $8}'| wc -l awk过滤统 ...

  3. mongodb的Limit|skip|投影|排序|消除重复

    Limit 方法limit():用于读取指定数量的文档 语法: db.集合名称.find().limit(NUMBER) 参数NUMBER表示要获取文档的条数 如果没有指定参数则显示集合中的所有文档 ...

  4. 使用awk统计字段重复实践

    awk awk是一种规格化文件的分析工具, 主要处理对象类似数据库导出的条目文本文件, 其中一行,就对应一个记录,每个记录包含若干个字段. 类似这种文本: [root@www ~]# last -n ...

  5. Mysql中较为复杂的分组统计去重复值

    这是我的代码: 前提是做了一个view:att_sumbase 首先分开统计每天的中午.下午饭点人数,这时需要分别去除中午和下午重复打卡的人.用了记录集的交,嵌套select的知识. 注意不能直接使用 ...

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

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

  7. EXCEL统计不重复值的数量

    如这一列中,有多少不重复值? 1.可以点击,数据,删除重复项,清除重复值,然后剩下的统计一下即可知道:       ===> 2.用公式:=SUMPRODUCT((MATCH(E3:E20,E3 ...

  8. poj1952 BUY LOW, BUY LOWER[线性DP(统计不重复LIS方案)]

    如题.$N \leqslant 5000$. 感觉自己思路永远都是弯弯绕绕的..即使会做也会被做繁掉..果然还是我太菜了. 递减不爽,先倒序输入算了.第一问做个LIS没什么说的.第二问统计个数,考虑什 ...

  9. SQL统计不重复字段的个数.

    注意:下面的举例适用于ORCLE和MSSQL,不能在Access中使用. 语法 SELECT COUNT(DISTINCT column(s)) FROM table 举例 With this &qu ...

随机推荐

  1. java写的web服务器

    经常用Tomcat,不知道的以为Tomcat很牛,其实Tomcat就是用java写的,Tomcat对jsp的支持做的很好,那么今天我们用java来写一个web服务器 //首先得到一个server, S ...

  2. Linux下mysql主从配置

    mysql服务器的主从配置,这样可以实现读写分离,也可以在主库挂掉后从备用库中恢复需要两台机器,安装mysql,两台机器要在相通的局域网内主机A: 192.168.1.100从机B:192.168.1 ...

  3. Redis安装及配置(Linux)

    ubuntu 16.04安装redis-server apt-get install redis-server 启动.停止.重启.重新加载.查看状态 /etc/init.d/redis-server ...

  4. JAVA的名词释义

    JDK : Java Development Toolkit (java 开发工具包). JDK是整个JAVA的核心,包括了java运行环境(Java Runtime Envirnmet),一堆jav ...

  5. look

    CSS3新浪微博模板商店列表图片抖动特效-易玩稀有 私家飞碟 | ¥18.00 开通会员  免费使用 购买 远古生物 | ¥18.00 开通会员  免费使用 购买 天地撞击 | ¥18.00 开通会员 ...

  6. 一个Public的字段引起的,谈谈继承中的new

    一直觉得对c#面向对象这块已经掌握的很好了,因为正常情况下字段一般我们设计成私有的,今天突然想到一个实验,如下有两个很简单的类: public class Farther { ; public vir ...

  7. 调用REST接口获取数据

    /// <summary> /// 根据机构代码本机构下报警用户列表: /// </summary> /// <param name="org_code&quo ...

  8. Linux有问必答:如何在Linux中修改环境变量PATH

    提问: 当我试着运行一个程序时,它提示“command not found”. 但这个程序就在/usr/local/bin下.我该如何添加/usr/local/bin到我的PATH变量下,这样我就可以 ...

  9. 登录界面 beta版

    1.MainActivity.java package com.example.administrator.myapplication; import android.content.Intent; ...

  10. 再论EM算法的收敛性和K-Means的收敛性

    标签(空格分隔): 机器学习 (最近被一波波的笔试+面试淹没了,但是在有两次面试时被问到了同一个问题:K-Means算法的收敛性.在网上查阅了很多资料,并没有看到很清晰的解释,所以希望可以从K-Mea ...