You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring JPA R2DBC中使用CamelCase替代SnakeCase?

解决Spring R2DBC指定@Table/@Column仍转snake_case的问题

核心问题

Spring R2DBC默认的NamingStrategy存在逻辑偏差:即便你在实体上通过@Table或@Column显式指定了CamelCase格式的表/列名,框架依然会对指定值执行snake_case转换操作。虽有修复记录,但在Spring Boot 3.2.5(集成spring-r2dbc 6.1.6)的部分场景下,该问题仍未彻底解决。

可行修复方案

方案1:自定义NamingStrategy,保留显式指定的名称

创建自定义命名策略,优先使用实体上显式指定的表/列名,仅在未指定时才应用默认的snake_case转换逻辑。

import org.springframework.data.r2dbc.mapping.R2dbcMappingContext;
import org.springframework.data.relational.core.mapping.NamingStrategy;
import org.springframework.data.relational.core.mapping.RelationalPersistentProperty;
import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;

public class ExactMatchNamingStrategy implements NamingStrategy {

    private final NamingStrategy defaultStrategy = NamingStrategy.INSTANCE;

    @Override
    public String getTableName(RelationalPersistentEntity<?> entity) {
        // 优先返回@Table指定的名称,否则用默认策略
        return entity.getTableName()
                .map(String::toString)
                .orElseGet(() -> defaultStrategy.getTableName(entity));
    }

    @Override
    public String getColumnName(RelationalPersistentProperty property) {
        // 优先返回@Column指定的名称,否则用默认策略
        return property.getColumnName()
                .map(String::toString)
                .orElseGet(() -> defaultStrategy.getColumnName(property));
    }
}

在配置类中注册该策略:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.r2dbc.config.EnableR2dbcAuditing;
import org.springframework.data.r2dbc.mapping.R2dbcMappingContext;

@Configuration
@EnableR2dbcAuditing
public class R2dbcConfig {

    @Bean
    public R2dbcMappingContext r2dbcMappingContext() {
        R2dbcMappingContext mappingContext = new R2dbcMappingContext();
        mappingContext.setNamingStrategy(new ExactMatchNamingStrategy());
        return mappingContext;
    }
}

方案2:配置文件禁用自动转换(全库CamelCase场景)

如果整个遗留数据库都采用CamelCase命名,可以直接在配置文件中强制框架保留显式指定的名称:

application.yml配置:

spring:
  data:
    r2dbc:
      naming-strategy: default

application.properties配置:

spring.data.r2dbc.naming-strategy=default

注意:该配置仅对显式指定的表/列名生效,未指定的属性仍会按默认规则转换。若全库都是CamelCase,建议配合自定义策略确保未指定的属性也使用CamelCase格式。

方案3:检查实体注解的正确性

确认你使用的是Spring R2DBC的注解而非JPA注解,且名称参数精确匹配CamelCase格式:

import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

@Table(name = "UserInfo") // 精确填写CamelCase表名
public class UserInfo {

    @Column(name = "UserId") // 精确填写CamelCase列名
    private Long userId;

    // 其他属性及方法
}

验证方法

开启R2DBC调试日志,查看生成的SQL语句是否符合预期:

logging:
  level:
    org.springframework.data.r2dbc: DEBUG

启动应用后,观察日志中的SQL语句,确认表名和列名是否为你指定的CamelCase格式。

内容的提问来源于stack exchange,提问作者Terry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:18:22