我有一组使用hibernate标准实现的搜索条件。 我添加了这样的分页:
criteria.setFirstResult(offset).setMaxResults(pageSize).setFetchSize(pageSize).list();
这对于分页是不够的,所以我已计算总结果大小。
totalResult = (Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();
问题是,我第一次提交搜索表单时,得到了正确的totalResult。 当我单击下一页,并且偏移量发生变化时,我在第二个语句处得到了NullPointExcetion。我不知道为什么。通过调试,我可以看到当这个异常发生时,第一个语句成功返回分页结果。
所以我想问一下,第一个声明与第二个声明冲突吗? (因为第一个语句将fetchsize设置为10,我想知道count(*)函数是否能正常工作。 它们是使用相同标准的不同任务,如何克隆或复制已添加许多限制的一个标准?)
答案 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参加会议。
但是如果你可以重置,你可能不需要两个。