在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中都可以工作。