我们一直在使用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和结果工作。我甚至在那里放了一些连接,它似乎仍然要快得多。
如果这仍然是一个好主意的任何输入?
答案 0 :(得分:2)
您可以使用Criteria的setProjection(Projections.property("id"))
。
答案 1 :(得分:1)
我认为通过单独的查询获取计数是唯一的选择,如果您想使用setFirstResult
和setMaxResults
来应用分页。
答案 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()