在上一篇中,大致學習了hibernate的基本查詢:HQL基本查詢,今天,繼續昨天的步伐,繼續學習hibernate的基本查詢。。。。。
1、hql聚合函數,先大致列一下hql的聚合函數有哪些吧:
在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); } }