spring-data-jpa未提供AnsiDialect,能否使用spring-data-jdbc对应方言连接Oracle?
方案说明
Spring Data JPA内置的方言都属于Hibernate生态,和Spring Data JDBC的Dialect体系完全独立,所以你不需要适配JPA的方言体系,直接基于Spring Data JDBC自身的扩展机制实现即可,有两种低改造成本的方案可选,无需从零全量开发:
方案1:基于AnsiDialect扩展适配
AnsiDialect已经实现了全部标准SQL语法的适配,仅需针对Oracle和标准SQL的差异点做重写即可,核心改造点如下:
- 分页语法适配:重写
limitClause、offsetClause方法,适配Oracle 12c+的OFFSET ... ROWS FETCH NEXT ... ROWS ONLY语法,或低版本的ROWNUM分页逻辑 - 主键策略适配:如果使用Oracle序列生成主键,重写
getIdGeneration()方法适配序列查询逻辑 - 标识符规则适配:重写
getIdentifierProcessing()方法,兼容Oracle默认标识符大写的规则
自定义方言实现完成后,直接在项目配置中添加如下配置即可生效:
spring.data.jdbc.dialect=com.yourpackage.CustomOracleAnsiDialect
方案2:复用Spring Data JDBC官方Oracle方言适配
Spring Data JDBC自身已经提供了官方的Oracle方言实现(和Hibernate的方言无关),如果你的专有驱动没有对SQL语法做大量自定义修改,可以直接继承该官方方言,仅重写驱动兼容性判断的逻辑即可,改造量比方案1更小。
只有当你的专有驱动对Oracle原生SQL语法做了大量非标改造,上述两种方案的默认逻辑都无法适配时,才需要全量实现Dialect接口完成自定义,该场景出现概率极低。
内容的提问来源于stack exchange,提问作者user6761124
相关产品推荐
相关产品推荐

