zoukankan      html  css  js  c++  java
  • hibernate学习系列-----(5)hibernate基本查询下篇:hibernate聚合函数、分组查询及命名查询

    在上一篇中,大致学习了hibernate的基本查询:HQL基本查询,今天,继续昨天的步伐,继续学习hibernate的基本查询。。。。。


    1、hql聚合函数,先大致列一下hql的聚合函数有哪些吧:

    图片1

    在SQL中,我们的聚合函数也是这些,并且用法也相同 。继续昨天的方式,用一个函数来展示:

    /**
         * HQL 聚合函数的使用
         */
        @Test
        public  void HQLAggregate(){
            Transaction tx=null;
            Session session=null;
            try{
                session=HibernateUtils.getSession();
                tx=session.beginTransaction();
                String hql="select min(stu.age) from Student stu";
                Query query=session.createQuery(hql);
            
                @SuppressWarnings("rawtypes")
                List list=query.list();
                System.out.println(list.get(0));
                
                
                tx.commit();
            }catch(HibernateException he){
                if(tx!=null){
                    tx.rollback();
                }
                he.printStackTrace();
            }finally{
                HibernateUtils.closeSession(session);
            }
            
        }

    需要注意的是,得到的结果是一个list集合,这样很方便的就可以使用操作集合的方法来进行结果的处理来。

    2、HQL分组查询:关键字 group by:

    通常,group by 会和聚集函数一起使用

    /**
         * HQL 分组函数
         */
        @Test
        public  void gruopFunction(){
            Transaction tx=null;
            Session session=null;
            try{
                session=HibernateUtils.getSession();
                tx=session.beginTransaction();
                String hql="select count(stu.id),stu.clazz from Student stu group by stu.clazz having avg(stu.age)>20";
                Query query=session.createQuery(hql);
                @SuppressWarnings("unchecked")
                List<Object[]> list=query.list();
                for(Object[]objs:list){
                    for(Object obj:objs){
                        System.out.println(obj);
                    }
                    System.out.println("-----分组信息-------");
                }
                tx.commit();
            }catch(HibernateException he){
                if(tx!=null){
                    tx.rollback();
                }
                he.printStackTrace();
            }finally{
                HibernateUtils.closeSession(session);
            }
            
        }

    这里的hql语句应该不难理解,学过SQL的同学们应该都会嘀热烈的笑脸

    3、分页查询:这个最实用来,在绝大多数的管理系统中,都会涉及到分页查询

    Query接口提供以下两个用于分页显示查询结果的方法:

    setFirstResult(int firstResult) 

    setMaxResult(int maxResults)

    /**
         * 分页查询
         * @param pageNo  页数
         * @param pageSize 分页大小
         */    
        public  void selectByPage(int pageNo,int pageSize){
            Transaction tx=null;
            Session session=null;
            try{
                session=HibernateUtils.getSession();
                tx=session.beginTransaction();
                String hql="from Student";
                Query query=session.createQuery(hql).setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize);
                @SuppressWarnings("unchecked")
                List<Student> list=(List<Student>)query.list();
                for(Student stu:list){
                    System.out.println(stu);
                }
                tx.commit();
            }catch(HibernateException he){
                if(tx!=null){
                    tx.rollback();
                }
                he.printStackTrace();
            }finally{
                HibernateUtils.closeSession(session);
            }
            
        }

    4、批量更新或者删除

    在Hibernate3以后,HQL新增了update与delete语句,可以直接使用HQL指定更新或删除。

    /**
         * HQL 更新或者删除
         */
        @Test
        public  void updateOrDelete(){
            Transaction tx=null;
            Session session=null;
            try{
                session=HibernateUtils.getSession();
                tx=session.beginTransaction();
                String hql="update Student set name='lixiaoyao' where id=:id";
                Query query=session.createQuery(hql);
                query.setInteger("id", 1);
                int i=query.executeUpdate();
                System.out.println(i);
                if(i>0){
                    System.out.println("更新成功");
                }else{
                    System.out.println("更新失败");
                }
                tx.commit();
            }catch(HibernateException he){
                if(tx!=null){
                    tx.rollback();
                }
                he.printStackTrace();
            }finally{
                HibernateUtils.closeSession(session);
            }
            
        }

    如果是删除的话,只需将上面的hql改为:

    String hql = "DELETE  Student  WHERE name = :id";
    Query query = session.createQuery(hql); 
    query.setInteger(“id”,1);
    int count = query.executeUpdate();

    5、hibernate命名查询

    hibernate的命名查询需要把查询语句写到关系对象映射文件中,此处,将下面的配置信息写到Student.hbm.xml文件中

    <!-- 配置hibernate的命名查询 -->
         <!-- name属性是必须的 -->
        <query name="studentHql">
                <!-- CDATA告诉xml的解析器不要解析它后面[]中的内容,而其中的内容就是HQL语句 -->
                <![CDATA[from Student]]>
        </query>

    需要注意的是:<query>标签是和<class> 标签同级的,如果不是会抛出异常,命名查询语句可以是HQL语句,也可以是本地SQL语句,程序代码也不区分命名查询语句的类型,一律通过Session的getNameQuery()方法来获得查询语句

    /**
         * HQL的命名查询方式
         */
        @Test
        public  void selectByNamed(){
            Transaction tx=null;
            Session session=null;
            try{
                session=HibernateUtils.getSession();
                tx=session.beginTransaction();
                Query query=session.getNamedQuery("studentHql");
                @SuppressWarnings("unchecked")
                List<Student> list=(List<Student>)query.list();
                for(Student stu:list){
                    System.out.println(stu);
                }
                tx.commit();
            }catch(HibernateException he){
                if(tx!=null){
                    tx.rollback();
                }
                he.printStackTrace();
            }finally{
                HibernateUtils.closeSession(session);
            }
            
        }

    好吧!hibernate的基本查询到这里就结束来,自我感觉还是很轻松的,当然,毕竟是很基础的东西咯。

  • 相关阅读:
    软件工程师的属性与发展
    欢迎使用CSDN-markdown编辑器
    hdu 5446 lucas+crt+按位乘
    poj 2891 模数不互质的中国剩余定理
    3037 插板法+lucas
    poj 1006中国剩余定理模板
    codeforce E
    UVA10820 send a table
    UVA1635 Irrelevant Elements
    uva 10375 Choose and Divide
  • 原文地址:https://www.cnblogs.com/doctorJoe/p/4709057.html
Copyright © 2011-2022 走看看