使用Hibernate3实现分页功能

 

 http://blog.csdn.net/zhjb1025/archive/2006/04/19/668631.aspx

  整理的代码如下:

  Page.Java接口

packageorg.domain.scrm4u.helper;
importjava.util.List;
publicinterfacePage{
  booleanisFirstPage();
  booleanisLastPage();
  booleanhasNextPage();
  booleanhASPreviousPage();
  intgetLastPageNumber();
  List<?>getThisPageElements();
  intgetTotalNumberOfElements();
  intgetThisPageFirstElementNumber();
  intgetThisPageLastElementNumber();
  intgetNextPageNumber();
  intgetPreviousPageNumber();
  intgetPageSize();
  intgetPageNumber();
}
 

  ListPage.java实现:

packageorg.domain.scrm4u.helper.impl;
importjava.util.List;
importorg.domain.scrm4u.helper.Page;
publicclassListPageimplementsPage{
  privateList<?>elements;
  privateintpageSize;
  privateintpageNumber;
  publicListPage(List<?>elements,intpageNumber,intpageSize){
    this.elements=elements;
    this.pageSize=pageSize;
    this.pageNumber=pageNumber;
    if(Integer.MAX_VALUE==this.pageNumber)this.pageNumber=(getTotalNumberOfElements()/this.pageSize);
  }
  publicbooleanisFirstPage(){
    returngetPageNumber()==0;
  }
  publicbooleanisLastPage(){
    returngetPageNumber()>=getLastPageNumber();
  }
  publicbooleanhasNextPage(){
    return((getPageNumber()+1)*getPageSize())<(getTotalNumberOfElements()+1);
  }
  publicbooleanhasPreviousPage(){
    returngetPageNumber()>0;
  }
  publicintgetLastPageNumber(){
    doubletotalResults=newInteger(getTotalNumberOfElements()).doubleValue();
    returnnewDouble(Math.floor(totalResults/getPageSize())).intValue();
  }
  publicList<?>getThisPageElements(){
    finalintstart=getPageNumber()*getPageSize();
    returnelements.subList(
          Math.min(start,getTotalNumberOfElements()+1), 
          Math.min(start+getPageSize(),getTotalNumberOfElements()+1)
       );
  }
  publicintgetTotalNumberOfElements(){
    returnelements.size()-1;
  }
  publicintgetThisPageFirstElementNumber(){
    returngetPageNumber()*getPageSize()+1;
  }
  publicintgetThisPageLastElementNumber(){
    intfullPage=getThisPageFirstElementNumber()+getPageSize()-1;
    returngetTotalNumberOfElements()<fullPage?getTotalNumberOfElements():fullPage;
  }
  publicintgetNextPageNumber(){
    returngetPageNumber()+1;
  }
  publicintgetPreviousPageNumber(){
    returngetPageNumber()-1;
  }
  publicintgetPageSize(){
    returnpageSize;
  }
  publicintgetPageNumber(){
    returnpageNumber;
  }
}
 

 

 

 HibernatePage.Java实现:

packageorg.domain.scrm4u.helper.impl;
importjava.util.List;
importorg.domain.scrm4u.helper.Page;
importorg.hibernate.HibernateException;
importorg.hibernate.Query;
importorg.hibernate.ScrollMode;
importorg.hibernate.ScrollableResults;
publicclassHibernatePageimplementsPage{
  protectedList<?>elements;
  protectedintpageSize;
  protectedintpageNumber;
  protectedinttotalElements=0;
  privateScrollableResultsscrollableResults;
  privateHibernatePage(intpageNumber,intpageSize){
    this.pageNumber=pageNumber;
    this.pageSize=pageSize;
  }
  publicbooleanisFirstPage(){
    returngetPageNumber()==0;
  }
  publicbooleanisLastPage(){
    returngetPageNumber()>=getLastPageNumber();
  }
  publicbooleanhasNextPage(){
    returnelements.size()>getPageSize();
  }
  publicbooleanhASPreviousPage(){
    returngetPageNumber()>0;
  }
  publicintgetLastPageNumber(){
    doubletotalResults=newInteger(getTotalNumberOfElements()).doubleValue();
    returnnewDouble(Math.floor(totalResults/getPageSize())).intValue();
  }
  publicList<?>getThisPageElements(){
    returnhasNextPage()?elements.subList(0,getPageSize()):elements;
  }
  publicintgetTotalNumberOfElements(){
    returntotalElements;
  }
  publicintgetThisPageFirstElementNumber(){
    returngetPageNumber()*getPageSize()+1;
  }
  publicintgetThisPageLastElementNumber(){
    intfullPage=getThisPageFirstElementNumber()+getPageSize()-1;
    returngetTotalNumberOfElements()<fullPage?getTotalNumberOfElements():fullPage;
  }
  publicintgetNextPageNumber(){
    returngetPageNumber()+1;
  }
  publicintgetPreviousPageNumber(){
    returngetPageNumber()-1;
  }
  publicintgetPageSize(){
    returnpageSize;
  }
  publicintgetPageNumber(){
    returnpageNumber;
  }
  publicstaticHibernatePagegetScrollPage(Queryquery,intpageNumber,intpageSize,ScrollModescrollMode){
    HibernatePagesp=newHibernatePage(pageNumber,pageSize);
    try{
      sp.scrollableResults=query.scroll(scrollMode);
      if(scrollMode==ScrollMode.SCROLL_SENSITIVE){
        sp.scrollableResults.last();
        sp.totalElements=sp.scrollableResults.getRowNumber();
      }else{
        sp.totalElements=sp.calculateTotalElementsByList(query);
      }
      sp.determineElements(query);
    }catch(HibernateExceptione){
      e.printStackTrace();
    }
    returnsp;
  }
  privatevoiddetermineElements(Queryquery)throwsHibernateException{
    if(Integer.MAX_VALUE==this.pageNumber)this.pageNumber=(getTotalNumberOfElements()/this.pageSize);
    elements=query.setFirstResult(this.pageNumber*this.pageSize).setMaxResults(this.pageSize+1).list();
  }
  privateintcalculateTotalElementsByList(Queryquery)throwsHibernateException{
    returnquery.list().size();
  }
}
 

简单分析一下:

  ListPage实现需要把查询的结果集全部取出来。

  我们着重还是分析一下HibernatePage的实现。

  测试代码如下:

importJava.io.IOException;
importjava.sql.SQLException;
importjava.util.List;
importorg.hibernate.Query;
importorg.hibernate.ScrollMode;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.AnnotationConfiguration;
importorg.hibernate.cfg.Configuration;
importorg.domain.scrm4u.helper.Page;
importorg.domain.scrm4u.helper.impl.HibernatePage;
importorg.domain.scrm4u.entity.TPsn;
publicclassBusinessService{
  publicstaticvoidmain(String[]args)throwsIOException,SQLException{
    Configurationconfig= newAnnotationConfiguration().configure();
    SessionFactorysessionFactory=config.buildSessionFactory();   
    Sessionsession=sessionFactory.openSession();
    StringHql="fromTPsn";
    Queryquery=session.createQuery(Hql);
    Pagepage=HibernatePage.getScrollPage(query,0,10,ScrollMode.SCROLL_SENSITIVE);
    List<?>list=page.getThisPageElements();
    for(inti=0;i<list.size();i++){
      TPsnpsn=(TPsn)list.get(i);
      System.out.println(psn.getPsnNo()+"t"+psn.getPsnPnm()+"t"+psn.getPsnBrthDt());
    } 
    session.close();
    sessionFactory.close();
  }
}
 

 

  测试中发现:

  使用ScrollMode.SCROLL_SENSITIVE比ScrollMode.FORWARD_ONLY在性能上要快很多。具体选择要看使用的JDBC驱动是否支撑了,支持scroll的话就可以使用ScrollableResults类来处理结果集了。

  当然,我们还可以配合缓存技术让翻页更有效率。

  关于缓存请参看http://blog.csdn.net/kunshan_shenbin/archive/2008/09/03/2874992.ASPx。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate分页实现可以通过使用Hibernate的Criteria API或者HQL语句来实现。在引用\[2\]中的代码示例中,使用Hibernate的findByCriteria方法来进行分页查询。该方法接受一个Criteria对象作为参数,可以设置查询条件和排序方式,并通过指定当前页码和每页显示的记录数来实现分页查询。 在引用\[3\]中的代码示例中,使用了HQL语句来进行分页查询。首先通过查询总记录数来计算总页数,然后通过设置起始索引和每页显示的记录数来获取指定页码的数据。 需要注意的是,以上示例中的代码只是部分代码片段,实际使用时需要根据具体的业务需求进行适当的修改和完善。 总结起来,Hibernate分页实现可以通过使用Criteria API或者HQL语句来设置查询条件和分页参数,从而实现分页查询功能。 #### 引用[.reference_title] - *1* [Hibernate分页实现](https://blog.csdn.net/lenny_wants/article/details/122555560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [hibernate实现分页的几种方式](https://blog.csdn.net/qq_34823118/article/details/78298139)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [hibernate实现分页](https://blog.csdn.net/NSJFYS/article/details/117958377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值