Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠条件中的计数(*)?_Hibernate - Fatal编程技术网

Hibernate 休眠条件中的计数(*)?

Hibernate 休眠条件中的计数(*)?,hibernate,Hibernate,我有一个使用hibernate标准实现的搜索标准组合。 我添加了这样的分页: criteria.setFirstResult(offset).setMaxResults(pageSize).setFetchSize(pageSize).list(); 这对于分页来说是不够的,所以我要计算结果的总大小 totalResult = (Integer)criteria.setProjection(Projections.rowCount()).uniqueResult(); 问题是,第一次提交搜索

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

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()。