Java 如何使用MySQL 5获得Hibernate条件查询的行数?
我们主要使用HQL。但是我们有一个复杂的搜索表单,它包含许多连接,所以我想我会尝试使用Criteria(以前从未有过)。我更喜欢它的语法,它符合我们的复杂形式 在应用Java 如何使用MySQL 5获得Hibernate条件查询的行数?,java,mysql,hibernate,rowcount,hibernate3,Java,Mysql,Hibernate,Rowcount,Hibernate3,我们主要使用HQL。但是我们有一个复杂的搜索表单,它包含许多连接,所以我想我会尝试使用Criteria(以前从未有过)。我更喜欢它的语法,它符合我们的复杂形式 在应用setMaxResults和setFirstResult之前,我的第一反应是做一个.list().size()。这当然是缓慢和懒惰的,是一个完全的资源消耗 通过谷歌搜索,我发现了一个使用ScrollableResults的示例。但是帖子说MySQL不支持游标。这是2004年的一篇文章。2012年,我们将MySQL 5与InnoDB表
setMaxResults
和setFirstResult
之前,我的第一反应是做一个.list().size()
。这当然是缓慢和懒惰的,是一个完全的资源消耗
通过谷歌搜索,我发现了一个使用ScrollableResults的示例。但是帖子说MySQL不支持游标。这是2004年的一篇文章。2012年,我们将MySQL 5与InnoDB表一起使用。所以我认为我们支持游标。然后我发现使用投影
所以我不是冬眠大师,我迷失在最好的道路上。我们将来可能会使用DB2,所以我想无论我使用什么解决方案,它都必须在DB2和MySQL 5中工作
有什么想法吗?我想至少我可以使用一个定制的HQL来获得一个计数(*)
谢谢
更新
我只是把这个放进去:
ScrollableResults scr = crit.scroll();
scr.last();
int rowCount = scr.getRowNumber() + 1;
vs
int rowCount = crit.list().size();
在我设置极限/起始值之前,这两个参数都是有效的。它跑得快多了。因此,我假设光标用于计算特定的DB和结果。我甚至在那里加入了一些连接,看起来速度还是快得多
关于这是否仍然是一个好主意的任何输入?我认为通过单独的查询获取计数是唯一的选择,如果要使用
setFirstResult
和setMaxResults
应用分页,可以使用标准的setProjection(Projections.property(“id”))
当然crit.list()
方法ScrollableResults.last()
取决于JDBC驱动程序的实现,它可能也非常慢,因为完整的ResultSet
可能会被完全加载,即使尚未创建Hibernate实体
最好的选择是使用crit.setProjection(Projections.rowCount()).uniqueResult()
,您可以在代码中包含hashcode()
,也就是说
criteria.setProjection(Projections.rowCount()).uniqueResult().hashCode()
如果DB2选项不在讨论范围内,该怎么办?那么答案会改变吗?谢谢我的答案是基于hibernate而不是数据库。请注意:Hibernate支持批量大小的惰性集合,这将满足您的需求,即将批量大小定义为页面大小,将整个集合定义为一次。它只是惰性地初始化它们,当您迭代时,它将批量加载结果。