当前位置:  开发笔记 > 编程语言 > 正文

如何使用hibernate重用Criteria对象?

如何解决《如何使用hibernate重用Criteria对象?》经验,为你挑选了1个好方法。

我正在尝试使用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对象并让它沿着theese线工作......

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()调用会修改条件对象,使其无法用于连续调用.我不完全确定调用的顺序,但db会在getFullListSize()尝试执行" select count(*) ... order by ..."时抛出错误,这显然是错误的.

我想我可以通过创建一个自己的对象来跟踪查询条件并为每个调用重建Criteria对象来解决这个问题,但这感觉就像重新发明了另一个轮子.有没有更聪明的方法,可能复制最初传入的Criteria并处理该副本?

更新:它看起来像是getList第一次getFullListSize被调用,之后被多次调用,因此,只要传入了一个订单,getFullListSize就会失败.只打一次db(getList我会说)并缓存结果,而不需要复制/重置Criteria对象,但仍然......

更新(再次):忘记这一点,一旦我完成了count我不能做select,反之亦然.我真的需要两个不同的Criteria对象.



1> 小智..:
Criteria.setProjection(null);
Criteria.setResultTransformer(Criteria.ROOT_ENTITY);

将有效地"重置"rowCount投影和标准本身执行之间的标准.

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


推荐这是正确的答案 - 比深度克隆更优雅.
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有