Hibernate Paging

本文提供了一种基于Hibernate和JPA的通用分页解决方案,通过定义Page接口并给出具体实现,支持获取当前页数据、总记录数等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Original Page From JavaEye

http://www.iteye.com/topic/996031?page=2

 

分页这个问题,如果你要自实现,我有段代码可以供你参考,这个是几年前参考Hibernate官方的一篇文章修改的,应该还是可以用的。

Java代码  收藏代码
  1. public   interface  Page<T> {  
  2.   
  3.     /**  
  4.      * @return 是否是首页(第一页),第一页页码为1  
  5.      */   
  6.     public   boolean  isFirst();  
  7.   
  8.     /**  
  9.      * @return 是否是最后一页  
  10.      */   
  11.     public   boolean  isLast();  
  12.   
  13.     /**  
  14.      * @return 是否有下一页  
  15.      */   
  16.     public   boolean  hasNext();  
  17.   
  18.     /**  
  19.      * @return 是否有上一页  
  20.      */   
  21.     public   boolean  hasPrevious();  
  22.   
  23.   
  24.     /**  
  25.      * @return 当前页的数据内容  
  26.      */   
  27.     public  List<T> getThisPageElements();  
  28.   
  29.     /**  
  30.      * @return 数据总的条目数量  
  31.      */   
  32.     public   int  getTotalNumberOfElements();  
  33.   
  34.     /**  
  35.      * @return 当前页的首条数据的行编码  
  36.      */   
  37.     public   int  getFirstElementNumber();  
  38.   
  39.     /**  
  40.      * @return 当前页的末条数据的行编码  
  41.      */   
  42.     public   int  getLastElementNumber();  
  43.   
  44.     /**  
  45.      * @return 当前页编码  
  46.      */   
  47.     public   int  getPageNumber();  
  48.   
  49.     /**  
  50.      * @return 下一页编码  
  51.      */   
  52.     public   int  getNextPageNumber();  
  53.   
  54.     /**  
  55.      * @return 上一页编码  
  56.      */   
  57.     public   int  getPreviousPageNumber();  
  58.   
  59.     /**  
  60.      * @return 获取最后一页页码,也就是总页数  
  61.      */   
  62.     public   int  getLastPageNumber();  
  63.   
  64.     /**  
  65.      * @return 每一页显示的条目数  
  66.      */   
  67.     public   int  getPageSize();  
  68. }  


基于Hibernate的实现:

Java代码  收藏代码
  1. public   class  HibernatePage<T>  implements  Page<T> {  
  2.   
  3.     private  List<T> elements;  
  4.     private   int  pageSize;  
  5.     private   int  pageNumber;  
  6.     private   int  totalElements =  0 ;  
  7.   
  8.     /**  
  9.      * 构建HibernatePage对象,完成Hibernate的Query数据的分页处理  
  10.      *  
  11.      * @param query  
  12.      *            Hibernate的Query对象  
  13.      * @param pageNumber  
  14.      *            当前页编码,从1开始,如果传的值为Integer.MAX_VALUE表示获取最后一页。  
  15.      *            如果你不知道最后一页编码,传Integer.MAX_VALUE即可。如果当前页超过总页数,也表示最后一页。  
  16.      *            这两种情况将重新更改当前页的页码,为最后一页编码。  
  17.      * @param pageSize  
  18.      *            每一页显示的条目数  
  19.      */   
  20.     public  HibernatePage(Query query,  int  pageNumber,  int  pageSize) {  
  21.         this .pageNumber = pageNumber;  
  22.         this .pageSize = pageSize;  
  23.         try  {  
  24.             ScrollableResults scrollableResults = query.scroll();  
  25.             // get the total elements number   
  26.             scrollableResults.last();  
  27.             this .totalElements = scrollableResults.getRowNumber();  
  28.             if  (Integer.MAX_VALUE ==  this .pageNumber ||  this .pageNumber > getLastPageNumber())  // last page   
  29.             {  
  30.                 this .pageNumber = getLastPageNumber();  
  31.             }  
  32.             elements = query.setFirstResult(  
  33.                     (this .pageNumber -  1 ) *  this .pageSize).setMaxResults(  
  34.                     this .pageSize +  1 ).list();  
  35.         } catch  (HibernateException e) {  
  36.             throw   new  RuntimeException(e);  
  37.         }  
  38.     }  
  39.   
  40.     public   boolean  isFirst() {  
  41.         return  getPageNumber() ==  1 ;  
  42.     }  
  43.   
  44.     public   boolean  isLast() {  
  45.         return  getPageNumber() >= getLastPageNumber();  
  46.     }  
  47.   
  48.     public   boolean  hasNext() {  
  49.         return  getLastPageNumber() > getPageNumber();  
  50.     }  
  51.   
  52.     public   boolean  hasPrevious() {  
  53.         return  getPageNumber() >  1 ;  
  54.     }  
  55.   
  56.     public   int  getLastPageNumber() {  
  57.         return  totalElements %  this .pageSize ==  0  ? totalElements /  this .pageSize : totalElements /  this .pageSize +  1 ;  
  58.     }  
  59.   
  60.     /**  
  61.      * 返回List类型数据  
  62.      *  
  63.      * @return List数据源  
  64.      */   
  65.     public  List<T> getThisPageElements() {  
  66.         return  elements;  
  67.     }  
  68.   
  69.     public   int  getTotalNumberOfElements() {  
  70.         return  totalElements;  
  71.     }  
  72.   
  73.     public   int  getFirstElementNumber() {  
  74.         return  (getPageNumber() -  1 ) * getPageSize() +  1 ;  
  75.     }  
  76.   
  77.     public   int  getLastElementNumber() {  
  78.         int  fullPage = getFirstElementNumber() + getPageSize() -  1 ;  
  79.         return  getTotalNumberOfElements() < fullPage ? getTotalNumberOfElements()  
  80.                 : fullPage;  
  81.     }  
  82.   
  83.     public   int  getNextPageNumber() {  
  84.         return  getPageNumber() +  1 ;  
  85.     }  
  86.   
  87.     public   int  getPreviousPageNumber() {  
  88.         return  getPageNumber() -  1 ;  
  89.     }  
  90.   
  91.     public   int  getPageSize() {  
  92.         return  pageSize;  
  93.     }  
  94.   
  95.     public   int  getPageNumber() {  
  96.         return  pageNumber;  
  97.     }  
  98. }  


基于JPA的实现:

Java代码  收藏代码
  1. public   class  JPAPage<T>  implements  Page<T> {  
  2.   
  3.     private  List<T> elements;  
  4.     private  Integer pageSize;  
  5.     private  Integer pageNumber;  
  6.     private  Integer totalElements =  0 ;  
  7.   
  8.     /**  
  9.      * 构建JPAPage对象,完成JPAPage的Query数据的分页处理  
  10.      *  
  11.      * @param countQuery  
  12.      *            Hibernate的查询总数的Query对象  
  13.      * @param pageNumber  
  14.      *            当前页编码  
  15.      * @param pageSize  
  16.      *            每一页显示的条目数  
  17.      * @param dataQuery  
  18.      *            Hibernate的查询结果的Query对象  
  19.      */   
  20.     public  JPAPage(Query countQuery,  int  pageNumber,  int  pageSize,  
  21.             Query dataQuery) {  
  22.         // 设置   
  23.         this .pageSize = pageSize;  
  24.         this .pageNumber = pageNumber;  
  25.         // 验证   
  26.         if  ( this .pageNumber <  1 ) {  
  27.             this .pageNumber =  1 ;  
  28.         }  
  29.         if  (Integer.MAX_VALUE ==  this .pageNumber ||  this .pageNumber > getLastPageNumber())  // last page   
  30.         {  
  31.             this .pageNumber = getLastPageNumber();  
  32.         }  
  33.         // 注入数据   
  34.         try  {  
  35.             Object obj = countQuery.getSingleResult();  
  36.             if  (obj !=  null  && obj  instanceof  Long) {  
  37.                 this .totalElements = ((Long) obj).intValue();  
  38.             } else  {  
  39.                 throw   new  NumberFormatException( "[countQuery is error.]" );  
  40.             }  
  41.   
  42.             elements = dataQuery.setFirstResult(  
  43.                     (this .pageNumber -  1 ) *  this .pageSize).setMaxResults(  
  44.                     this .pageSize +  1 ).getResultList();  
  45.         } catch  (Exception e) {  
  46.             throw   new  RuntimeException(e);  
  47.         }  
  48.     }  
  49.   
  50.     public   boolean  isFirst() {  
  51.         return  getPageNumber() ==  1 ;  
  52.     }  
  53.   
  54.     public   boolean  isLast() {  
  55.         return  getPageNumber() >= getLastPageNumber();  
  56.     }  
  57.   
  58.     public   boolean  hasNext() {  
  59.         return  getLastPageNumber() > getPageNumber();  
  60.     }  
  61.   
  62.     public   boolean  hasPrevious() {  
  63.         return  getPageNumber() >  1 ;  
  64.     }  
  65.   
  66.     public   int  getLastPageNumber() {  
  67.         return  totalElements %  this .pageSize ==  0  ? totalElements /  this .pageSize : totalElements /  this .pageSize +  1 ;  
  68.     }  
  69.   
  70.     /**  
  71.      * 返回List类型数据  
  72.      *  
  73.      * @return List数据源  
  74.      */   
  75.     public  List<T> getThisPageElements() {  
  76.         return  elements;  
  77.     }  
  78.   
  79.     public   int  getTotalNumberOfElements() {  
  80.         return  totalElements;  
  81.     }  
  82.   
  83.     public   int  getFirstElementNumber() {  
  84.         return  (getPageNumber() -  1 ) * getPageSize() +  1 ;  
  85.     }  
  86.   
  87.     public   int  getLastElementNumber() {  
  88.         int  fullPage = getFirstElementNumber() + getPageSize() -  1 ;  
  89.         return  getTotalNumberOfElements() < fullPage ? getTotalNumberOfElements()  
  90.                 : fullPage;  
  91.     }  
  92.   
  93.     public   int  getNextPageNumber() {  
  94.         return  getPageNumber() +  1 ;  
  95.     }  
  96.   
  97.     public   int  getPreviousPageNumber() {  
  98.         return  getPageNumber() -  1 ;  
  99.     }  
  100.   
  101.     public   int  getPageSize() {  
  102.         return  pageSize;  
  103.     }  
  104.   
  105.     public   int  getPageNumber() {  
  106.         return  pageNumber;  
  107.     }  
  108. }  


同样,基于JDBC的实现或者其他什么数据结构查询的实现都很简单。使用Freemarker/Velocity分页宏编写也很容易。

这个分页虽然粗糙,但是一般的应用足够了,不过在排序方面还有待改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值