JPA,在我的特殊情况下,eclipselink会在使用/*+ FIRST_ROWS */
的情况下生成query.setFirstResult()/query.setMaxResults()
:
SELECT * FROM (
SELECT /*+ FIRST_ROWS */ a.*, ROWNUM rnum FROM (
SELECT * FROM TABLES INCLUDING JOINS, ORDERING, etc.) a
WHERE ROWNUM <= 10 )
WHERE rnum > 0;
这迫使Oracle使用嵌套循环而不是散列连接。总的来说,它具有优势,但在我的特殊情况下,它会大大降低性能。
是否可以禁用特定查询的提示使用/生成?
答案 0 :(得分:1)
正如@ ibre5041所述,FIRST_ROWS提示已被弃用,在Oracle的上下文中,应使用FIRST_ROWS(N)代替它。在我的情况下,实际上既不需要FIRST_ROW也不需要FIRST_ROW(N),所以为了告诉eclipselink不要使用过时的东西,可以在persistence.xml中指定oracle版本:
<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.oracle.Oracle11Platform" />
添加后,我得到了一个奇怪的错误: Could not initialize class org.eclipse.persistence.platform.database.oracle.Oracle11Platform 但是,在我将ojdbcN.jar放到domain / lib / ext之后,错误就消失了。
因此,eclipselink会在没有FIRST_ROW提示的情况下生成查询,而Oracle会使用更好的计划。