在 Oracle 11g 中,JPA 生成的 SQL 使用“fetch first ? rows only”失败并出现 ORA-00933

Posted

技术标签:

【中文标题】在 Oracle 11g 中,JPA 生成的 SQL 使用“fetch first ? rows only”失败并出现 ORA-00933【英文标题】:JPA generated SQL with "fetch first ? rows only" fails with ORA-00933 in Oracle 11g 【发布时间】:2020-04-24 10:45:18 【问题描述】:

在 Spring Boot 2.0 项目中,我有一个带有查询方法的 JpaRepository 对象。一种查询方法返回分页结果集。

Page<Model> findByPartContainingIgnoreCaseAndModelContainingIgnoreCaseAndNeedsUpdateContainingIgnoreCase(String part, String model, String needsUpdate, Pageable pageReguest);

此 JPA 查询方法在查询 Oracle 12c 数据库时运行,使用以下 SQL:

select * from (SQL)  where rownum <= 100

查询 Oracle 11g 数据库时,相同的 JPA 查询方法失败并显示 (ORA-00933),并生成以下 SQL:

select SQL **fetch first 100 rows only**

为什么相同的代码库会为不同的 Oracle 数据库生成不同的 SQL?我们该如何解决这个问题?

该项目使用 ojdbc6(版本 - 11.2.0.4)Oracle 驱动程序。

【问题讨论】:

它似乎在连接到 11g 时生成 12c 的代码,在连接到 12c 时生成 11g 的代码 - 这听起来确实像一个错误。或者你在这两种情况下都使用了错误的 Hibernate 方言。 @a_horse_with_no_name 问题出在方言上。 【参考方案1】:

问题是因为方言。一开始我使用的是一种较旧的方言——“org.hibernate.dialect.Oracle9iDialect”

通过在 application.properties 中设置以下方言解决了问题。

spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect

【讨论】:

以上是关于在 Oracle 11g 中,JPA 生成的 SQL 使用“fetch first ? rows only”失败并出现 ORA-00933的主要内容,如果未能解决你的问题,请参考以下文章

Spring数据JPA存储库saveAll不生成批量插入查询

PL/SQ连接oracle,L 新建表的时候, virtual那一列是啥意思

oracle11g生成awr报告

Oracle 11g AWR 系列五:如何生成 AWR 报告?

为啥从 JBoss 7.1.0EAP 到 Oracle 11g 生成了 100 个幽灵 Oracle 会话

linux下oracle 11g怎么执行脚本生成hr用户名