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

如何让Hibernate生成全大写SQL?(JPA+IBM DB2环境)

让Hibernate生成全大写SQL(含关键字、别名)的配置方案

针对JPA搭配IBM DB2场景,要让Hibernate生成的SQL全大写(包括SELECT/AS这类关键字,以及NAME_A这种别名),可以通过以下两步配置实现:

1. 强制SQL关键字大写

直接在配置文件里添加Hibernate参数,让所有SQL关键字自动转大写:

  • Spring Boot环境(application.properties):
spring.jpa.properties.hibernate.sql.keyword_style=upper
  • 传统JPA环境(persistence.xml):
<property name="hibernate.sql.keyword_style" value="upper"/>

这个配置会把select、from、as这类关键字统一转换成SELECT、FROM、AS。

2. 自定义命名策略实现别名/列名全大写

默认的Hibernate命名策略会把实体属性转成小写下划线(比如nameA→name_a),要改成大写下划线,需要自定义命名策略:

方案一:基于PhysicalNamingStrategy(Hibernate 5.x及以上推荐)

写一个自定义的物理命名策略类,把所有标识符转成大写:

public class UpperCasePhysicalNamingStrategy implements PhysicalNamingStrategy {
    @Override
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
        return toUpperCaseIdentifier(name);
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
        return toUpperCaseIdentifier(name);
    }

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return toUpperCaseIdentifier(name);
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
        return toUpperCaseIdentifier(name);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return toUpperCaseIdentifier(name);
    }

    private Identifier toUpperCaseIdentifier(Identifier name) {
        if (name == null) return null;
        return Identifier.toIdentifier(name.getText().toUpperCase(), name.isQuoted());
    }
}

然后在配置里指定这个类:

  • Spring Boot:
spring.jpa.hibernate.naming.physical-strategy=com.your.package.UpperCasePhysicalNamingStrategy
  • 传统JPA:
<property name="hibernate.physical_naming_strategy" value="com.your.package.UpperCasePhysicalNamingStrategy"/>

方案二:基于ImprovedNamingStrategy(兼容旧版Hibernate)

如果用的是Hibernate 5之前的版本,可以继承ImprovedNamingStrategy重写方法:

public class UpperCaseNamingStrategy extends ImprovedNamingStrategy {
    @Override
    public String propertyToColumnName(String propertyName) {
        return super.propertyToColumnName(propertyName).toUpperCase();
    }

    @Override
    public String alias(String alias) {
        return alias.toUpperCase();
    }
}

配置指定:

  • Spring Boot:
spring.jpa.hibernate.naming.strategy=com.your.package.UpperCaseNamingStrategy
  • 传统JPA:
<property name="hibernate.ejb.naming_strategy" value="com.your.package.UpperCaseNamingStrategy"/>

配置后效果

完成以上配置后,Hibernate生成的SQL会完全符合预期:

SELECT TAB.NAME1 AS NAME_A, TAB.NAME2 AS NAME_B FROM TABLE_NAME AS TAB;

内容的提问来源于stack exchange,提问作者Guruprasad A N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:42:47