Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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
Java 如何使用MySQL 5获得Hibernate条件查询的行数?_Java_Mysql_Hibernate_Rowcount_Hibernate3 - Fatal编程技术网

Java 如何使用MySQL 5获得Hibernate条件查询的行数?

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表

我们主要使用HQL。但是我们有一个复杂的搜索表单,它包含许多连接,所以我想我会尝试使用Criteria(以前从未有过)。我更喜欢它的语法,它符合我们的复杂形式

在应用
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支持批量大小的惰性集合,这将满足您的需求,即将批量大小定义为页面大小,将整个集合定义为一次。它只是惰性地初始化它们,当您迭代时,它将批量加载结果。