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. hdu1024 Max Sum Plus Plus

    动态规划,给定长度为n(≤1e6)的整数数组和整数m,选取m个连续且两两无交集的子区间,求所有方案中使得区间和最大的最大值. dp[i][j]表示结束位置(最后一个区间最后一个元素的位置)为i且选取区 ...

  2. fg、bg、jobs、&、ctrl + z

    原文地址:fg.bg.jobs.&.ctrl + z 作者:china-yuan http://blog.chinaunix.net/uid-22433093-id-1774026.html ...

  3. linux下安装图片识别环境

    升级python http://blog.csdn.net/jcjc918/article/details/11022345 安装MySQLdb sudo yum install MySQL-pyth ...

  4. ubuntu /etc/profile和/etc/environment的比较

    先将export LANG=zh_CN加入/etc/profile ,退出系统重新登录,登录提示显示英文. 将/etc/profile 中的export LANG=zh_CN删除,将LNAG=zh_C ...

  5. 华东交通大学2016年ACM“双基”程序设计竞赛 1001

    Problem Description 输入一个非负的int型整数,是奇数的话输出"ECJTU",是偶数则输出"ACM". Input 多组数据,每组数据输入一 ...

  6. 2016年11月11日 星期五 --出埃及记 Exodus 20:2

    2016年11月11日 星期五 --出埃及记 Exodus 20:2 "I am the LORD your God, who brought you out of Egypt, out o ...

  7. Storm系列之二——Guaranteeing Message Processing

    Storm保证每跳离开spout的消息都会被完全处理.本文介绍Storm是怎么保证每条消息都被完全处理并且作为用户该怎么做才能从Storm的可靠性保证受益. 1.什么叫消息被完全处理? 一个tuple ...

  8. C语言中'\0'与'\n'

    '\0'表示ASCII编号为0的字符,在C语言中最常用于代表字符串结束的标志.'\n'表示ASCII编号为13的字符,代表回车键,输出这个字符就会换一行. '\0'作为字符串的结束标志,本身会占用一个 ...

  9. 6-JS函数(二)

    函数 函数的实参和形参 function temp (a,b){ console.log(a) }; // a , b为两个形参 var a1 = 2; var b1 = 3; temp(a1,b1) ...

  10. BZOJ 1513 [POI2006]Tet-Tetris 3D

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1513 题意:三维空间,有一些立方体在垂直下落.立方体的左下角坐标(x,y)以及长宽 ...