【发布时间】: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