【发布时间】:2010-09-27 00:08:54
【问题描述】:
我正在尝试使用 hibernate 和 displaytag 对查询结果进行分页,而 Hibernate DetachedCriteria 对象正在尽力阻止。让我解释一下……
使用 displaytag 进行分页的最简单方法似乎是实现 PaginatedList 接口,其中包括以下方法:
/* Gets the total number of results. */
int getFullListSize();
/* Gets the current page of results. */
List getList();
/* Gets the page size. */
int getObjectsPerPage();
/* Gets the current page number. */
int getPageNumber();
/* Get the sorting column and direction */
String getSortCriterion();
SortOrderEnum getSortDirection();
我正在考虑将我的 PaginatedList 实现扔给 Criteria 对象,并让它按照这些思路工作...
getFullListSize() {
criteria.setProjection(Projections.rowCount());
return ((Long) criteria.uniqueResult()).intValue();
}
getList() {
if (getSortDirection() == SortOrderEnum.ASCENDING) {
criteria.addOrder(Order.asc(getSortCriterion());
} else if (getSortDirection() == SortOrderEnum.DECENDING) {
criteria.addOrder(Order.desc(getSortCriterion());
}
return criteria.list((getPageNumber() - 1) * getObjectsPerPage(),
getObjectsPerPage());
}
但这不起作用,因为addOrder() 或setProjection() 调用会修改条件对象,使其无法用于后续调用。我不完全确定调用的顺序,但是数据库在 getFullListSize() 尝试执行“select count(*) ... order by ...”时抛出错误,这显然是错误的。
我认为我可以通过创建自己的对象来跟踪查询条件并为每次调用重建 Criteria 对象来解决此问题,但这感觉就像重新发明了另一个轮子。有没有更聪明的方法,可能复制最初传入的 Criteria 并处理该副本?
更新:
看起来getList 是先调用的,然后getFullListSize 会被调用多次,所以只要有一个ordering 传入,getFullListSize 就会失败。只打一次数据库(我想说getList)并缓存结果是有意义的,无需复制/重置Criteria对象,但仍然......
更新(再次):
忘记这一点,一旦我完成了count,我就不能再做select,反之亦然。我真的需要两个不同的 Criteria 对象。
【问题讨论】:
标签: java hibernate spring-mvc pagination displaytag