如何在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
相关产品推荐
相关产品推荐

