在 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那一列是啥意思
Oracle 11g AWR 系列五:如何生成 AWR 报告?