是否可以禁用每个特定查询的jpa提示?

时间:2016-04-25 12:36:06

标签: java oracle jpa oracle11g

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使用嵌套循环而不是散列连接。总的来说,它具有优势,但在我的特殊情况下,它会大大降低性能。

是否可以禁用特定查询的提示使用/生成?

1 个答案:

答案 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会使用更好的计划。