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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:53:26