【问题标题】:Hibernate Hql find result size for paginatorHibernate Hql查找分页器的结果大小
【发布时间】:2011-02-08 06:21:45
【问题描述】:

我需要为我的 Hibernate 应用程序添加分页器。我通过设置 Projection.count() 将它应用于我使用 Criteria 执行的一些数据库操作。这工作正常。 但是当我使用 hql 进行查询时,我似乎无法获取有效的方法来获取结果计数。 如果我这样做 query.list().size() 会花费很多时间,而且我认为 hibernate 确实会加载内存中的所有对象。

任何人都可以在使用 hql 时提出一种有效的方法来检索结果计数吗?

【问题讨论】:

标签: java hibernate orm pagination hql


【解决方案1】:

您必须使用另一个查询和Query#iterate()。见14.16. Tips & Tricks部分:

您可以统计查询结果的数量而不返回它们:

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

【讨论】:

    【解决方案2】:

    我过去做过类似的事情。如果您想获得分页器的总记录数,那么我建议您先执行一个单独的查询。这个查询应该只做一个计数并返回总数。

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

    如果您能侥幸成功,因为如果您的 where 子句效率低下,即使是计数查询也可能需要时间,只需检查您是否获得了一整页记录,并设置某种指示符以表明存在下一页可能会有更多结果。这是最快的方法,因为您只需根据需要查询每个页面。

    【讨论】:

    • 嘿,感谢您的回复。您建议我可以设置某种类型的指标来显示可能有更多记录。问题是如果我的 pageSize 为 10,并且假设有 100 条记录,那么对于第 10 页,我会得到 10 个结果,我可能会设置指标来说明可能有更多记录。问题是我们需要通过 Web 服务将结果发送到 UI,在这种情况下,最后一次没有结果的调用可能对我们来说太昂贵了......
    • 好吧,我过去用来解决这个问题的另一个技巧是,我不是每次都带回 10 个结果,而是请求 11 个。我仍然显示 10 个,但是第 11 个结果的存在是用于表示可以添加“更多结果”链接,安全地知道有更多结果。除此之外,在开始请求页面行之前,您确实必须查看初始计数查询以找出有多少结果。如果您的索引很好,计数可以非常快,因为数据库(不是休眠)可以完成工作。
    • 这个技巧很酷....我可以用这个。初始计数的问题是我的查询太复杂了,每次构建相应的计数查询(简单但)对我来说都是开销,因为在我之间涉及一些 3-4 层(调用)构建我的查询以及我实际执行查询的位置。我不想增加我的堆栈.. :)
    猜你喜欢
    • 2011-09-14
    • 2016-04-05
    • 1970-01-01
    • 2012-03-14
    • 2015-08-29
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多