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的基本查詢到這里就結束來,自我感覺還是很輕松的,當然,畢竟是很基礎的東西咯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM