首页 > 解决方案 > 用于分页的 Oracle 方言

问题描述

我们正在使用 spring data JDBC 从 oracle 中检索数据

我们正在使用org.springframework.data.relational.core.dialect.OracleDialect从数据库中检索数据。

当我们有一个使用的存储库时,它按预期工作CrudRepository

但是,如果我们修改扩展PagingAndSortingRepository为根据页码检索的存储库,则会出现异常。

根据分析,我们确定了由 Oracle 生成的查询LIMIT_CLAUSE并且LOCK_CLAUSE不遵守 Oracle。

是否有一个 Oracle 方言来生成一个适当的限制查询,它是一个实例org.springframework.data.relational.core.dialect.Dialect

标签: paginationspring-dataoracle12cspring-data-jdbcdialect

解决方案


唯一可用的OracleDialect is based on the AnsiDialect` 和 Oracle12c 应该支持 ANSI 标准。

进一步的调查导致怀疑 ANSI 标准允许多个变体并AnsiDialect创建一个不适用于 Oracle12 的子句,尽管它被用于测试的 OracleXE18 接受。

Spring Data JDBC 当前创建表单的子句OFFSET %d ROWS FETCH FIRST %d ROWS ONLY。根据https://dba.stackexchange.com/questions/30452/ansi-iso-plans-for-limit-standardization符合标准。

但是https://stackoverflow.com/a/24046664/66686暗示 Oracle12 可能需要OFFSET %d ROWS FETCH NEXT %d ROWS ONLY

作为一种解决方法,您可以按照https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0#dialects中所述注册自定义方言


推荐阅读