如何在休眠状态下重用Criteria对象?

羊肉:

我正在尝试使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在休眠状态下建立友谊关系?

如何在休眠状态下基于ID更新行

如何在休眠状态下对实体进行本地修订?

如何在休眠状态下保存外键?

如何在休眠状态下使用UNION执行查询

如何在休眠状态下指定Double的精度?

如何在休眠状态下进行乐观锁定

如何在休眠状态下编写联接查询

如何在休眠状态下使用SQL in()?

如何在休眠状态下更新表?

分离对象如何在休眠状态下工作

如何在设置状态下更新对象数组

如何在反应状态下使用索引更新对象?

如何在休眠状态下删除具有外键的行?

如何在休眠状态下检查是否存在具有不同ID的相同数据?

如何在休眠状态下使用条件转换mysql联接查询

如何在休眠状态下使用聚合函数编写查询?

如何在休眠状态下仅审计超类的一部分?

如何在休眠状态下将父类转换为继承的子类?

如何在休眠状态下获取远程数据库的数据

如何在休眠状态下将Oracle时间戳映射到适当的Java类型?

如何在休眠状态下仅在UTC中存储特定的时间戳列

如何在休眠状态下持久保存子类的超类变量?

如何在休眠状态下重新生成已删除的序列号?

如何在休眠状态下持久存在实体期间验证对实体的约束

如何在休眠状态下检索数据库表值?

如何在休眠状态下仅删除@OneToOne双向映射的一侧

如何在休眠状态下按条件编写子句条件?

dynamic-update = true在休眠状态下如何在内部工作?