我正在尝试使用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对象来解决此问题,但这就像在重新发明另一个轮子。有没有更聪明的方法,可以复制最初传入的条件并对该副本进行处理?
更新:看起来像先getList
被调用,然后getFullListSize
被多次调用,所以一旦有订单传入,getFullListSize
就会失败。只打一次数据库(getList
缓存)并缓存结果,而不需要复制/重置Criteria
对象是很有意义的,但是仍然...
更新(再次):忘记了这一点,一旦完成,count
就无法执行select
,反之亦然。我真的需要两个不同的Criteria
对象。
好吧,DetachedCriteria是可序列化的,因此您具有内置的(如果不太出色)深层克隆支持。您可以在构造后将初始条件序列化为byte [],然后在每次使用它时将其反序列化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句