【问题标题】:Spring data jdbc Identifier ProcessingSpring数据jdbc标识符处理
【发布时间】:2021-04-14 16:48:10
【问题描述】:

用例:连接 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, @Lazy RelationResolver relationResolver,
        @Qualifier("oracleJdbcOperationsReference") NamedParameterJdbcOperations oracleJdbcOperationsReference) {
    DefaultJdbcTypeFactory jdbcTypeFactory = new DefaultJdbcTypeFactory(
            oracleJdbcOperationsReference.getJdbcOperations());
    return new BasicJdbcConverter(mappingContext, relationResolver, oracleJdbcCustomConversions(), jdbcTypeFactory,
            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`

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

【问题讨论】:

    标签: spring oracle11g spring-data-jdbc dialect


    【解决方案1】:

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

    1. 实现你自己的Dialect
    2. 实现 JdbcDialectProvider 返回 Dialect
    3. 通过将文件 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 的方言已经开箱即用。

    【讨论】:

    • 我想我没有清楚地解释我的问题。如上所述,我正在将数据从 Oracle 传输到 MySQL。我已经为每个数据库定义了 DataSource、Dialect bean。此外,我还为那些具有适当参数的类注释了@EnableJdbcRepositories。当请求到来时,它会选择正确的连接并尝试执行查询。由于我已经将 MySQL 注释为主要,所以它总是使用 MySQL 方言的标识符处理。因此,oracle 查询总是有反引号字符(反引号是 MySQL DB 的默认值),这会产生问题。
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 2021-08-02
    • 2020-04-14
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多