Hibernate和EJB3中的分页

发布者    |      

在ejb3-feedback@sun.com上刚刚有一个有趣的讨论,由David Cherryhomes发起,我在其中愚蠢地坚持认为某些事情不能做到,而事实上,当我仔细考虑时,我意识到我之前实际上已经做到了,甚至Hibernate AdminApp 示例也使用了这种模式!

所以,为了避免再次忘记这种模式,我将把它写下来,并且还将编写一个实现它的可重用类。

基本问题是分页。我想向用户显示“下一页”和“上一页”按钮,但如果没有更多的,或者没有先前的查询结果,则禁用它们。但是,我不希望在每次请求中检索所有查询结果,或者执行一个单独的查询来计数。所以,这里是有正确的方法

public class Page {
   
   private List results;
   private int pageSize;
   private int page;
   
   public Page(Query query, int page, int pageSize) {
       
       this.page = page;
       this.pageSize = pageSize;
       results = query.setFirstResult(page * pageSize)
           .setMaxResults(pageSize+1)
           .list();
   
   }
   
   public boolean isNextPage() {
       return results.size() > pageSize;
   }
   
   public boolean isPreviousPage() {
       return page > 0;
   }
   
   public List getList() {
       return isNextPage() ?
           results.subList(0, pageSize-1) :
           results;
   }

}

您可以将此对象返回到JSP,并在Struts、WebWork或JSTL标签中使用它。在持久化逻辑中获取页面就像这样

public Page getPosts(int page) {
    return new Page( 
        session.createQuery("from Posts p order by p.date desc")
        page,
        40
    );
}

Page类在Hibernate和EJB 3.0中都可以工作。


返回顶部