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

标签 java oracle jpa oracle11g

JPA(在我的特定情况下为 eclipselink)在使用 query.setFirstResult()/query.setMaxResults() 的情况下生成 /*+ FIRST_ROWS */:

SELECT * FROM (
  SELECT /*+ FIRST_ROWS */ a.*, ROWNUM rnum  FROM (
    SELECT * FROM TABLES INCLUDING JOINS, ORDERING, etc.) a
  WHERE ROWNUM <= 10 )
WHERE rnum > 0;

这迫使 Oracle 使用嵌套循环而不是散列连接。一般来说,这是有降神会的,但在我的特殊情况下,它会大大降低性能。

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

最佳答案

正如 @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 使用更好的计划。

关于java - 是否可以禁用每个特定查询的 jpa 提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840776/

相关文章:

java - 是否可以删除不需要的标签的文本节点

java - JNA 和 Java 语言关键字

oracle - 使用 sql developer Version Version 18.1.0.095 Build 095.1630 导出转储文件 oracle 时出错

sql - 无法在报告中计算平均天数?

java - Hibernate 使用嵌入的 ElementCollection 抛出 ConcurrentModificationException

java - Eclipse IDE 2019-06 在打破嵌套循环后不显示建议

java - 如何通过 URL 发送当前文本字段值?

java - 在 URL 中,orgId、UserId 和 User 没有出现在 R12 中

java - GlassFish Server 部署和 MySQLNonTransientConnectionException

jsf - JavaEE6 : How to safeguard web application when the database shut down