Quarkus环境下JPA映射数据库列到DTO的属性名问题
解决Quarkus下JPA DTO列映射异常问题
问题根源
出现这种差异是因为Quarkus默认的Hibernate命名策略对连续大写字母的驼峰转换规则,与非连续大写的情况不同:
- 对于
statusGhGj(大写字母间隔小写字母),命名策略会自动转换为status_gh_gj,与数据库列名匹配,无需额外配置即可正常映射; - 对于
statusGR(连续两个大写字母),默认策略会转换为status_gr,与数据库列名status_g_r不匹配,即便添加@Column(name="status_g_r"),如果getter/setter命名不规范或者命名策略配置冲突,也会导致映射失效返回null。
解决方案
1. 严格规范属性的Getter/Setter命名
确保属性statusGR对应的getter和setter完全符合JavaBean规范,同时保留@Column注解精准指定列名:
private String statusGR; @Column(name = "status_g_r") public String getStatusGR() { return statusGR; } public void setStatusGR(String statusGR) { this.statusGR = statusGR; }
2. 调整Hibernate物理命名策略
如果希望统一处理连续大写字母的驼峰转换,可在application.properties中配置命名策略,让连续大写字母也能被拆分为下划线分隔格式:
# 使用Hibernate内置策略,将驼峰全转换为下划线分隔(默认会把statusGR转为status_gr,若需status_g_r需自定义) quarkus.hibernate-orm.naming.physical-strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
若需要将statusGR转为status_g_r,可自定义命名策略类:
public class CustomPhysicalNamingStrategy extends CamelCaseToUnderscoresNamingStrategy { @Override protected String transformColumnName(ColumnNaming columnNaming) { return transformString(columnNaming.getColumnName()); } private String transformString(String input) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); if (Character.isUpperCase(c) && i > 0) { sb.append('_'); } sb.append(Character.toLowerCase(c)); } return sb.toString(); } }
然后在配置文件中指定自定义策略:
quarkus.hibernate-orm.naming.physical-strategy=com.yourpackage.CustomPhysicalNamingStrategy
3. 确认实体类注解配置
如果你的DTO作为JPA实体类使用,确保类上添加@Entity和@Table注解,且@Column的name属性与数据库列名完全一致(若数据库区分大小写,需额外配置quarkus.hibernate-orm.database.globally-quote-identifiers=true)。
内容的提问来源于stack exchange,提问作者Bruno Colares
相关产品推荐
相关产品推荐

