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