Spring数据jdbc标识符处理

问题描述

用例:连接 MysqL 和 oracle 数据库

问题:如果我将任何一个数据源注释为主,它总是使用主数据库标识符处理并基于此形成查询

MysqL

@Bean
@Primary
@Qualifier("mysqljdbcConverter")
public JdbcConverter mysqljdbcConverter(JdbcMappingContext mappingContext,@Lazy RelationResolver relationResolver,@Qualifier("mysqljdbcOperationsReference") NamedParameterJdbcoperations mysqljdbcOperationsReference) {
    DefaultJdbcTypeFactory jdbcTypeFactory = new DefaultJdbcTypeFactory(
            mysqljdbcOperationsReference.getJdbcoperations());
    return new BasicJdbcConverter(mappingContext,relationResolver,mysqljdbcCustomConversions(),jdbcTypeFactory,IdentifierProcessing.create(new Quoting("`"),LetterCasing.UPPER_CASE));
}

@Bean
@Primary
@Qualifier("mysqljdbcDialect")
public Dialect mysqljdbcDialect(final JdbcConverter JdbcConverter) {
    return MysqLDialect.INSTANCE;
}

甲骨文

@Bean
@Qualifier("oracleJdbcConverter")
public JdbcConverter oracleJdbcConverter(JdbcMappingContext mappingContext,@Qualifier("oracleJdbcoperationsReference") NamedParameterJdbcoperations oracleJdbcoperationsReference) {
    DefaultJdbcTypeFactory jdbcTypeFactory = new DefaultJdbcTypeFactory(
            oracleJdbcoperationsReference.getJdbcoperations());
    return new BasicJdbcConverter(mappingContext,oracleJdbcCustomConversions(),IdentifierProcessing.create(new Quoting("\""),LetterCasing.UPPER_CASE));
}

@Bean
@Qualifier("oracleJdbcDialect")
@RequestScope
public Dialect oracleJdbcDialect(final JdbcMappingContext JdbcConverter) {
    return OracleDialect.INSTANCE;
}

在上述情况下,始终查询带有反引号字符。即使是连接oracle数据库,但标识符总是反引号

查询

SELECT `service`.`SERVICE_ID` AS `SERVICE_ID`,`service`.`SERVICE_NAME` AS `SERVICE_NAME` FROM `service`

我可以知道为什么会这样吗?

解决方法

Dialect 不是从 ApplicationContext 中提取的 bean。如果您想使用自己的 Dialect,您需要执行以下操作:

  1. 实现您自己的 Dialect
  2. 实现返回该 JdbcDialectProviderDialect
  3. 通过将文件 spring.factories 放在类路径的 META-INF 文件夹中并添加行 org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=<fully qualified name of your JdbcDialectProvider>
  4. 来注册提供程序

https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0#dialects

但实际上您不应该这样做,因为 Oracle 和 MySql 的方言已经开箱即用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...