我有一个搜索条件的组合,通过使用休眠标准实现.我添加了这样的分页:
criteria.setFirstResult(offset).setMaxResults(pageSize).setFetchSize(pageSize).list();
Run Code Online (Sandbox Code Playgroud)
这对于分页是不够的,所以我计算了总结果大小.
totalResult = (Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();
Run Code Online (Sandbox Code Playgroud)
问题是,我第一次提交搜索表单时,得到了正确的totalResult.当我单击下一页,并且偏移量发生变化时,我在第二个语句处得到了NullPointExcetion.我不知道为什么.并且通过调试,我可以看到当发生此异常时,第一个语句成功返回分页结果.
所以我想问一下,第一个声明与第二个声明冲突吗?(因为第一个语句将fetchsize设置为10,我想知道count(*)函数是否能正常工作.它们是使用相同条件的不同任务,如何克隆或复制已经添加了许多限制的一个条件?)
小智 30
只是为了修复count(*)查询 - 更好地使用此代码作为标准:
Integer totalResult = ((Number)criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
Run Code Online (Sandbox Code Playgroud)
否则你会收到错误 java.lang.Long cannot be cast to java.lang.Integer
我认为冲突实际上是计数查询中的限制,所以我希望它在第二次分页查询时返回错误的结果.
对两者使用单个Criteria需要在使用之间进行一些重置,这可以通过以下方式完成:
criteria.setProjection(null)
.setResultTransformer(Criteria.ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)
如果你真的想要两个独立但相同的标准,我认为最简单的方法是首先创建一个DetachedCriteria,它是Serializable,并使用序列化 - 反序列化克隆黑客来创建另一个,然后通过附加到会话将它们转换为普通Criteria .
但是如果你可以重置,你可能不需要两个.
| 归档时间: |
|
| 查看次数: |
43385 次 |
| 最近记录: |