gpt4 book ai didi

java - 如何在 hibernate 中重用 Criteria 对象?

转载 作者:IT老高 更新时间:2023-10-28 21:14:28 25 4
gpt4 key购买 nike

我正在尝试使用 hibernate 和 displaytag 对查询结果进行分页,而 Hibernate DetachedCriteria 对象正在尽力阻止。让我解释一下……

使用 displaytag 进行分页的最简单方法似乎是实现 PaginatedList 接口(interface),其中包括以下方法:

/* 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 对象。

最佳答案

Criteria.setProjection(null);
Criteria.setResultTransformer(Criteria.ROOT_ENTITY);

将有效地“重置”rowCount 投影和标准本身执行之间的标准。

我会确保在执行 rowCount 之前没有添加您的订单,这会减慢速度。我的 PaginatedList 实现总是在查找结果之前运行计数查询,因此排序不是问题。

关于java - 如何在 hibernate 中重用 Criteria 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/368966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com