我有一些争吵与Hibernate。 我的查询,但优化,是相当沉重。我的一个优化是限制返回的结果集。 所以与Hibernate我用的方法setMaxResultSet,但我打在这篇文章中描述了同样的问题:休眠HQL和setMaxResults
Hibernate: Pagination with setFirstResult and setMaxResult
(的问题是使用setMaxResultSet冬眠在某些情况下,包裹本查询:
select * from (your query) where rownum <= :rownum
)
所以,在这种情况下,解决办法是增加一个排序依据,BU我已经数以百万计的记录和排序依据杀死查询的执行时间。 我已经成功使用createNativeQuery和传球,我需要准确的查询(类似“my query where rownum <= :rownum" instead of "select * from (your query) where rownum <= :rownum", and goodbye portability
)克服了这个问题,但老实说,我不知道为什么休眠这样的行为......
正如前面帖子建议,只要你的查询“不稳定”,hibernate就可以解析SQL,因为如果我没有误解,两次执行之间的记录顺序可能不一样,但我不明白方法可以解决这个稳定性问题
很简单:如果你在查询中有'where rownum <=:rownum',则在应用'order by'之前应用*限制。因此,无论您在查询中使用什么顺序,它总是会返回相同的第一行。这显然不是你想要的:如果你按名字排序,你首先需要名字,而只有N个名字。不是任意N个第一行,按名称排序。 –
我不认为它以这种方式工作......从我能看到直接在数据库试图查询,添加排序依据操作者再次杀人的执行时间,因此它似乎ROWNUM应用排序依据(我假设后DB是试图获取并为了所有符合查询,然后命令他们返回前N的记录) –