如何使用MySQL 5获取Hibernate Criteria查询的行数?

时间:2012-11-09 16:14:08

标签: java mysql hibernate rowcount hibernate3

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

在我应用.list().size()setMaxResults之前,我的第一直觉就是setFirstResult。这当然是缓慢而懒惰的,而且资源总量很大。

经过一番谷歌搜索后,我找到了一个使用ScrollableResults的例子。但帖子称MySQL不支持游标。这是2004年的帖子。在2012年,我们将MySQL 5与InnoDB表一起使用。所以我认为我们支持游标。然后我发现使用投影。

所以不是一个Hibernate大师,我迷失在最好的方式。我们 MIGHT 将来会使用DB2,所以我想我使用它的任何解决方案都必须在DB2和MySQL 5中运行。

有什么想法吗?我想至少我可以使用自定义HQL来获取计数(*)。

由于

更新

我把它放在:

ScrollableResults scr = crit.scroll();
scr.last();
int rowCount = scr.getRowNumber() + 1;

VS

int rowCount = crit.list().size();

在我设置限制/起始值之前。它运行得更快。所以我假设光标正在为特定的DB和结果工作。我甚至在那里放了一些连接,它似乎仍然要快得多。

如果这仍然是一个好主意的任何输入?

4 个答案:

答案 0 :(得分:2)

您可以使用Criteria的setProjection(Projections.property("id"))

答案 1 :(得分:1)

我认为通过单独的查询获取计数是唯一的选择,如果您想使用setFirstResultsetMaxResults来应用分页。

答案 2 :(得分:0)

确保crit.list().size()将在Hibernate会话中将完整的行集加载为实体。

方法ScrollableResults.last()依赖于JDBC驱动程序实现,它也可能非常慢,因为即使尚未创建Hibernate实体,也可能完全加载完整的ResultSet

最好的选择是使用crit.setProjection(Projections.rowCount()).uniqueResult()

答案 3 :(得分:0)

您可以在代码中加入hashcode(),即

criteria.setProjection(Projections.rowCount()).uniqueResult().hashCode()