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

Saw*_*yer 21 hibernate

我有一个搜索条件的组合,通过使用休眠标准实现.我添加了这样的分页:

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

  • 没有强制转换的好方法:`Integer totalCount = criteria.setProjection(Projections.rowCount()).uniqueResult().hashCode();`.你将得到相同的结果. (6认同)
  • 我不确定我是否相信你的巧妙技巧(尽管我印象深刻)。hashCode() 合同规定哈希码不必从一次运行到下一次保持相同,因此 Oracle 完全有权更改 hashCode() 方法,尽管可能性不大。不过,我宁愿只调用 intValue()。 (2认同)

Don*_*oby 8

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

对两者使用单个Criteria需要在使用之间进行一些重置,这可以通过以下方式完成:

 criteria.setProjection(null)
         .setResultTransformer(Criteria.ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)

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

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