1. 程式人生 > >Hibernate實現分頁的工具類

Hibernate實現分頁的工具類

1、 分析查詢方式

a)        HQL語句查詢

面向物件的查詢語言,與SQL不同,HQL中的物件名是區分大小寫的(除了JAVA類和屬性其他部分不區分大小寫);HQL中查的是物件而不是和表,並且支援多型;HQL主要通過Query來操作

b)       Criteria物件查詢

Criteria是一種比HQL更面向物件的查詢方式;Criteria的建立方式。

2、 建立工具類ListPageUtil並建立兩個靜態方法,

a)        Integer getSize(Class clazz):用來返回指定物件對應的表的總記錄數。

b)        List ListPage(Integer pageSize,IntegernowPage,Class clazz) 指定每頁大小和當前頁,並傳入指定的類,返回當前顯示的所有記錄數並用List集合返回。

c)        把建構函式訪問許可權設定成私有,單例類,不能將其用new例項化,只能呼叫其中靜態方法。

3、 實現方法

a)        List ListPage(IntegerpageSize,Integer nowPage,Class clazz)

                       i.             HQL方式程式碼實現如下:

public static List listPage(Integer pageSize,Integer nowPage,Classclazz){      

              /*使用HQL查詢實現分頁*/

       Session session=null

;

       //宣告返回值

       List entities=null;

       /*定義HQL查詢語句(後面為指定獲取它的類名)*/

       String hql="from "+clazz.getName();

       /*計算出從哪一條記錄開始查詢*/

       Integer nowCount=pageSize*(nowPage-1);

       try{

           /*獲取session物件*/

           session=HibernateUtil.getSession();

           /*根據hql語句獲取到Query物件*/

           Query query=session.createQuery(hql);

           /*設定從第幾條記錄開始查詢*/

           query.setFirstResult(nowCount);

           /*設定一共查詢出多少條*/

           query.setMaxResults(pageSize);

           /*指定並返回集合*/

           entities=query.list();

           return entities;

       }finally{

           if(session!=null){

              //釋放資源

              session.close();

           }

       }

}

                     ii.             Criteria物件查詢程式碼實現如下:

    public static List listPage(Integer pageSize,Integer nowPage,Classclazz){

       /*利用Criteria物件查詢實現分頁*/

       Session session=null;

       //宣告返回值

       List entities=null;

       try{

           session=HibernateUtil.getSession();

           //利用criteria物件查詢出指定的物件

           Criteria cri=session.createCriteria(clazz);

           cri.setFirstResult(pageSize*(nowPage-1));

           cri.setMaxResults(pageSize);

           entities=cri.list();

           return entities;

       }finally{

           if(session!=null){

              //釋放資源

              session.close();

           }

}

b)       List getSize(Class clazz)

/*查詢指定物件的總記錄數*/

    public static Integer getSize(Class clazz){

       Session session=null;

       //宣告返回值

       Integer size=0;

       /*構造HQL查詢語句*/

       String hql="selectcount(*) from "+clazz.getName();

       try{

           /*獲取session物件*/

           session=HibernateUtil.getSession();

           /*根據hql語句得到query物件*/

           Query query=session.createQuery(hql);

           /*將結果先轉換成字串再並解析成整型型別*/

           size=Integer.parseInt(query.uniqueResult().toString());

           /*返回結果*/

           return size;

       }finally{

           if(session!=null){

              //釋放資源

              session.close();

           }

       }

}

分頁收穫:開始顯示的時候用的HQL查詢,接受的引數是Class型別,但是沒有辦法構造出對應的HQL語句,因為前面帶有包的字首,如 java.lang.String。在Criteria物件查詢不會遇到這種情況,因為它是更加面向物件的查詢方式。

       在接受到Class類的物件時候,只要用getName方法則可以獲取到名字,構造的HQL語句帶有字首的包名也不會影響結果,比如構造出的HQL查詢語句是  from cn.csdn.domain.User 。也可以解析並返回正確的結果。

本工具類已在JSP頁面中測試過,可以正常使用,沒有錯誤。