在休眠标准中计数(*)?

时间:2010-01-29 06:20:10

标签: hibernate

我有一组使用hibernate标准实现的搜索条件。 我添加了这样的分页:

criteria.setFirstResult(offset).setMaxResults(pageSize).setFetchSize(pageSize).list();

这对于分页是不够的,所以我已计算总结果大小。

totalResult = (Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();

问题是,我第一次提交搜索表单时,得到了正确的totalResult。 当我单击下一页,并且偏移量发生变化时,我在第二个语句处得到了NullPointExcetion。我不知道为什么。通过调试,我可以看到当这个异常发生时,第一个语句成功返回分页结果。

所以我想问一下,第一个声明与第二个声明冲突吗? (因为第一个语句将fetchsize设置为10,我想知道count(*)函数是否能正常工作。 它们是使用相同标准的不同任务,如何克隆或复制已添加许多限制的一个标准?)

2 个答案:

答案 0 :(得分:31)

修复count(*)查询 - 更好地将此代码用于标准:

Integer totalResult = ((Number)criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();

否则您将收到错误java.lang.Long cannot be cast to java.lang.Integer

答案 1 :(得分:8)

我认为冲突实际上是count查询中的限制,所以我希望它在第二次分页查询时返回错误的结果。

对两者使用单一标准需要在使用之间进行一些重置,这可能是按照以下方式进行的:

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

如果你真的想要两个独立但相同的标准,我认为最简单的方法是首先创建一个DetachedCriteria,它是Serializable,并使用序列化 - 反序列化克隆黑客来制作另一个,然后通过附加将它们转换为普通的Criteria参加会议。

但是如果你可以重置,你可能不需要两个。