hibernate的统计查询
来源:互联网 发布:python界面开发html5 编辑:程序博客网 时间:2024/05/17 01:38
转自:http://blog.sina.com.cn/s/blog_5fad23090100fcgr.html
hibernate的统计查询:sum 取最大、取最小、分组
一、查询记录个数 count(*)关键字
测试方法如下:
package com.bjsxt.hibernate;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
public class StatQueryTest extends TestCase {
public void testQuery1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
List students=session.createQuery("select count(*) from Student").list();
//因为在list中只有一个表示记录个数的数字,所以执行这个list的get(0),取出第0个位置元素就可以了
Long count=(Long)students.get(0);
System.out.println(count);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
}
方法执行后,生成的SQL语句为select count(*) as col_0_0_ from t_student student0_
执行结果为:110
二、但是,上面的方式还存在缺点,查询结果取出的是list,实际上,list只有一个元素。我们还要拿到list,然后get(0)。这样不太好。
hibernate还有一种方式,如果查询后返回的是单一值,如count max sum等,可以采用它的uniqueResult,就是唯一结果的意思。这样就可以得到返回的单一的值。如果没有值返回,就是空。
测试方法如下:
public void testQuery2(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Long count=(Long)session.createQuery("select count(*) from Student").uniqueResult();
System.out.println(count);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
生成的查询语句与返回结果同上。
三、其他的查询:sum,max,等与count是一样的。
四、分组查询
测试方法为:
public void testQuery3(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
List students=session.createQuery("select c.name,count(s) from Student s join s.classes c group by c.name order by c.name desc").list();
for(Iterator iterator=students.iterator();iterator.hasNext();){
Object[] obj=(Object[])iterator.next();
System.out.println(obj[0]+","+obj[1]);
}
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
生成的查询语句为:
select classes1_.name as col_0_0_, count(student0_.id) as col_1_0_ from t_student student0_ inner join t_classes classes1_ on student0_.classesid=classes1_.id group by classes1_.name order by classes1_.name desc
执行结果为:
班级9,10
班级8,10
班级7,10
班级6,10
班级5,10
班级4,10
班级3,10
班级2,10
班级1,10
班级0,10
2、如果查询语句改为由t_classes连接t_student,其查询结果也是一样的
public void testQuery3(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
List students=session.createQuery("select c.name,count(s) from Classes c join c.students s group by c.name order by c.name desc").list();
for(Iterator iterator=students.iterator();iterator.hasNext();){
Object[] obj=(Object[])iterator.next();
System.out.println(obj[0]+","+obj[1]);
}
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
生成的SQL语句为:
select classes0_.name as col_0_0_, count(students1_.id) as col_1_0_ from t_classes classes0_ inner join t_student students1_ on classes0_.id=students1_.classesid group by classes0_.name order by classes0_.name desc
查询结果:
班级9,10
班级8,10
班级7,10
班级6,10
班级5,10
班级4,10
班级3,10
班级2,10
班级1,10
班级0,10
3、为什么两种查询方式结果是一样呢?因为第一种方式,学生表在左边,班级表在右边
第二种查询方式,班级表在左边,学生表在右边。
但其显示都会是:班级0 学生0
班级0 学生1
。。。。
班级1,学生0
班级1,学生1
。。。。
也就是先将两个表连接起来,然后再统计每个班级的学生人数,就是count(t_stdent_id).
统计查询[重要]
*但是用hibernate做统计还是比较少的,通常采用统计的中间件。就是说,大量的统计,大量的报表,通常采用工具来做。
- hibernate的统计查询
- hibernate的统计查询
- hibernate的HQL的统计查询
- Hibernate中HQL的统计查询
- Hibernate统计查询手记
- hibernate统计查询
- hibernate统计查询
- Hibernate统计和查询二级缓存
- Hibernate Criteria 统计函数查询
- EasyUI+SpringMVC+Hibernate 日期区间查询统计
- 023——hibernate统计查询
- 查询集的统计
- [Hibernate]Hibernate的HQL查询
- [Hibernate]Hibernate的QBC查询
- Hibernate的查询 HQL查询
- Hibernate的查询方式
- hibernate的查询死锁
- 扩展hibernate的查询
- 浅谈 Linux 内核开发之 PCI 设备驱动
- vs 2005 制作安装程序详解
- Linux环境下无配置信息PCI设备的驱动开发
- vs 2005 制作安装程序详解
- 面试中遇到递归算法题别慌--常见递归算法题的解题思路
- hibernate的统计查询
- java迭代法--素数,阶乘,最大公约数,最小公倍数
- 寻找大智慧软件动态链接库函数之一
- java面试题--4个线程两个线程每次对j增加1另外两个线程对j每次减少1
- Java为何能跨平台
- 软件设计理论(转)
- sicily 1346 金明的预算方案 有依赖的背包问题
- datastage问题汇总
- JSP的内置对象的调用函数介绍