hibernate的统计查询

    技术2026-08-31  5

    转自: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 做统计还是比较少的,通常采用统计的中间件。就是说,大量的统计,大量的报表,通常采用工具来做。

    最新回复(0)