问题描述
问题:如果我将任何一个数据源注释为主,它总是使用主数据库标识符处理并基于此形成查询。
@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
,您需要执行以下操作:
- 实现您自己的
Dialect
。 - 实现返回该
JdbcDialectProvider
的Dialect
。 - 通过将文件 spring.factories 放在类路径的
META-INF
文件夹中并添加行org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=<fully qualified name of your JdbcDialectProvider>
来注册提供程序
见https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0#dialects
但实际上您不应该这样做,因为 Oracle 和 MySql 的方言已经开箱即用。