Hibernate 休眠条件中的计数(*)?
我有一个使用hibernate标准实现的搜索标准组合。 我添加了这样的分页:Hibernate 休眠条件中的计数(*)?,hibernate,Hibernate,我有一个使用hibernate标准实现的搜索标准组合。 我添加了这样的分页: criteria.setFirstResult(offset).setMaxResults(pageSize).setFetchSize(pageSize).list(); 这对于分页来说是不够的,所以我要计算结果的总大小 totalResult = (Integer)criteria.setProjection(Projections.rowCount()).uniqueResult(); 问题是,第一次提交搜索
criteria.setFirstResult(offset).setMaxResults(pageSize).setFetchSize(pageSize).list();
这对于分页来说是不够的,所以我要计算结果的总大小
totalResult = (Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();
问题是,第一次提交搜索表单时,我得到了正确的结果。
当我单击下一页,偏移量改变时,我在第二条语句中得到了一个NullPointExction。我不知道为什么。通过调试,我可以看到当这个异常发生时,第一条语句成功地返回分页结果
所以我想问,第一句话和第二句话冲突吗?(因为第一条语句将fetchsize设置为10,我想知道count(*)函数是否能正常工作。
它们是使用相同条件的不同任务,如何克隆或复制一个已经添加了许多限制的条件?我认为冲突实际上是计数查询中的限制,因此我希望它在第二次运行分页查询时返回错误的结果 对这两种情况使用单一标准需要在使用之间进行一些重置,这可能可以通过以下方式完成:
criteria.setProjection(null)
.setResultTransformer(Criteria.ROOT_ENTITY);
如果您确实想要两个独立但相同的条件,我认为最简单的方法是首先创建一个可序列化的DetachedCriteria,然后使用序列化-反序列化克隆技术创建另一个条件,然后通过附加到会话将其转换为正常条件
但是,如果您可以在重置中工作,则可能不需要两个。只是为了修复计数(*)查询-最好使用以下代码作为条件:
Integer totalResult = ((Number)criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
否则您将得到一个错误
java.lang.Long无法转换为java.lang.Integer
谢谢,实际上我的解决方案与您的答案完全相同。它起作用了!没有强制转换的好方法:Integer totalCount=criteria.setProjection(Projections.rowCount()).uniqueResult().hashCode()代码>。你会得到同样的结果。漂亮的把戏!直到看到你的评论和查看jdk源代码,我才意识到这一点。我不确定我是否相信你的巧妙技巧(尽管我印象深刻)。hashCode()合同规定,哈希代码在一次运行到下一次运行时不必保持不变,因此Oracle完全有权更改hashCode()方法,尽管可能性不大。尽管如此,我还是希望调用intValue()。