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

