2010-04-15 48 views
1

我需要为我的Hibernate应用程序添加paginator。我将它应用于我通过设置Projection.count()使用Criteria执行的一些数据库操作,这很正常。 但是,当我使用hql查询,我似乎无法得到和有效的方法来获得结果计数。 如果我做query.list().size()它需要很多时间,我认为休眠确实会加载内存中的所有对象。Hibernate Hql寻找paginator的结果大小

任何人都可以请建议一个有效的方法来检索使用hql时的结果计数?

+0

看到这个问题:http://stackoverflow.com/questions/168084/is-there-一个更高效的方式制作分页在休眠比执行é – serg 2010-04-15 15:17:57

回答

1

我在过去做过类似的事情。如果你想得到paginator的记录总数,那么我建议你先做一个单独的查询。这个查询只需要进行计数并返回总数。

正如你怀疑的那样,为了统计你的主查询记录,hibernate确实必须加载所有记录,尽管最好不要加载每条记录的所有数据。但是这仍然需要时间。

如果你可以避开它,因为即使计数查询可能需要时间,如果你的where子句效率低下,只要检查你有一整页的记录回来,并提出一种指示器来显示下一页可能会有更多结果。这是最快的方法,因为您只需根据需要查询每个页面。

+0

嘿,谢谢你的回应。你建议我可以设置某种类型的指标,以显示它可能是更多的记录..这个问题是如果我的pageSize是10,并假设有100条记录,那么对于第10页,我会得到10个结果,我可能会设置dicator说明可能会有更多的记录。事情是我们需要通过网络服务将结果发送给用户界面,在这种情况下,最后一次没有结果的调用可能会对我们来说太昂贵... – KCore 2010-04-15 14:15:37

+0

好的,我过去用过的另一个技巧是解决这个问题而不是每次都带回10个结果,我请求11.我仍然显示10,但是第11个结果的存在用于表明可以添加“更多结果”链接,因为安全地知道有更多结果。 除此之外,在开始请求页面行之前,您必须查看初始计数查询以了解有多少结果。如果你的索引是好的,因为数据库(而不是休眠)完成了工作,计数可以非常快。 – drekka 2010-04-15 23:52:41

+0

这个技巧很酷....我可以使用这个。 初始计数的问题是我的查询会过于复杂,每次构建一个相应的计数查询(简单但是)对我来说都是一个开销,因为从哪里涉及到一些3-4层(调用)我建立我的查询,并在那里我真正执行我的查询。我不想增加我的堆栈.. :) – KCore 2010-04-16 05:49:15

2

你将不得不使用另一个查询和Query#iterate()。见14.16. Tips & Tricks

你可以统计查询结果的数目而不必返回他们:

((Integer) session.createQuery("select count(*) from ....").iterate().next()).intValue()