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頁面中測試過,可以正常使用,沒有錯誤。