【问题标题】:hibernate hql and setMaxResults休眠 hql 和 setMaxResults
【发布时间】:2015-11-24 09:08:51
【问题描述】:

我和hibernate有些争吵。 我的查询虽然经过优化,但非常繁重。我的一项优化包括限制返回的结果集。 所以在休眠时,我使用了 setMaxResultSet 方法,但我遇到了这篇文章中描述的同样问题:

Hibernate: Pagination with setFirstResult and setMaxResult

(问题是在某些情况下使用 setMaxResultSet hibernate 会像这样包装查询:

select * from (your query) where rownum <= :rownum)

因此,在这种情况下,解决方案是添加 orderBy,但我有数百万条记录,而 orderBy 会缩短查询的执行时间。 我已经设法使用 createNativeQuery 克服了这个问题,并传递了我需要的确切查询(类似于“my query where rownum <= :rownum" instead of "select * from (your query) where rownum <= :rownum", and goodbye portability”),但老实说,我不明白为什么 Hibernate 会这样......

正如上一篇文章所建议的那样,只要您的查询“不稳定”,hibernate 就会解析这样的 SQL,因为如果我没有误解,两次执行之间的记录顺序可能不一样,但我不明白这种方法如何解决这个稳定性问题。

【问题讨论】:

  • 很简单:如果查询中有where rownum <= :rownum,则在应用order by 之前 应用限制。因此,无论您在查询中使用什么顺序,它总是会返回相同的第一行。这显然不是您想要的:如果您按名称排序,您首先需要第一个名称,并且只需要前 N 个名称。不是任意的前 N ​​行,按名称排序。
  • 我不认为它是这样工作的......从我可以看到直接在数据库上尝试查询,再次添加 orderBy 运算符会杀死执行时间,所以似乎应用了 rownum在 orderBy 之后(我想数据库正在尝试获取和排序与查询匹配的所有记录,然后命令它们返回第一个 N)

标签: java sql hibernate jpa rownum


【解决方案1】:

我在hibernate中使用相同的分页。下面给出了HQL。它可能对你有用。

(i) 最初你应该使用这个查询

List<Object> Entity_Cls_Lst= Objclass.createQuery("from library where book_id>Book_ID order by book_id").list();

(ii) 滚动后,您应该获取最后一个结果数据的 Book_ID 并在 where 条件下传递给查询。

  List<Object> Entity_Cls_Lst= Objclass.createQuery("from library where book_id>Book_ID order by book_id").setMaxResults(MAX_RECORDS).list();

【讨论】:

  • 我看到关于您的解决方案的几个问题,第一个是我不能使用 order By 运算符,因为它会使查询变得非常慢,所以我既不能使用 ID 作为过滤器,导致我的记录的 id 没有排序。
  • 我使用了此处发布的解决方案,它有时会失败并按结果给出不正确的顺序,因为它类似于 SQL:select * from (your query) where rownum
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
相关资源
最近更新 更多