版本说明
spring版本:4.3.7
hibernate版本:5.1.17 Final
达梦数据库版本:DM Database Server 64 V8
pom文件引入达梦数据库驱动
<!-- 达梦数据库驱动 --><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.2.192</version></dependency><dependency><groupId>com.dameng</groupId><artifactId>DmDialect-for-hibernate5.0</artifactId><version>8.1.2.192</version></dependency>对应jar:
DmJdbcDriver18-8.1.2.192.jar
DmDialect-for-hibernate5.0-8.1.2.192.jar
配置达梦数据库连接
cytjdb.driverClassName=dm.jdbc.driver.DmDriver cytjdb.url=jdbc:dm://192.168.xx.xxx:5236?schema=BBP402CYTJDEV41 cytjdb.username=BBP402CYTJDEV41 cytjdb.password=xxxx cytjdb.dialect=org.hibernate.dialect.DmDialect cytjdb.validationQuery=SELECT 'x' FROM DUAL
程序之前用的oracle19C,之前语法有 select A as name的语法,在oralce下,统一返回大写NAME,但是转为达梦数据库后发现select A as name ,结果也返回小写的name了,需要改为select A as NAME ,才会返回大写,整个系统很多地方都是写的小写的字段名,这样改造工作量很大,下面记录下全局修改的方式
重写hibernate方言转换字段大小写(代码层面实现)
MyDmUpperCaseDialect.java
packageorg.hibernate.dialect;importorg.hibernate.type.StringType;importjava.sql.ResultSetMetaData;importjava.sql.SQLException;importjava.sql.Types;/** * @description: 自定义达梦方言:强制将 ResultSet 中的列别名转为大写 * @date: 2026/2/6 * @author: gaom * @version: 1.0 */publicclassMyDmUpperCaseDialectextendsDmDialect{publicMyDmUpperCaseDialect(){super();// 如果有特殊类型映射,可在此注册registerHibernateType(Types.OTHER,StringType.INSTANCE.getName());}@OverridepublicColumnAliasExtractorgetColumnAliasExtractor(){returnUpperCaseColumnAliasExtractor.INSTANCE;}privatestaticclassUpperCaseColumnAliasExtractorimplementsColumnAliasExtractor{publicstaticfinalUpperCaseColumnAliasExtractorINSTANCE=newUpperCaseColumnAliasExtractor();@OverridepublicStringextractColumnAlias(ResultSetMetaDataresultSetMetaData,intcolumn)throwsSQLException{// 获取列标签(通常是别名),并转为大写Stringlabel=resultSetMetaData.getColumnLabel(column);returnlabel!=null?label.toUpperCase():"";}}}修改配置文件使用重写的方言
# 方言 cytjdb.dialect=org.hibernate.dialect.MyDmUpperCaseDialect修改后重启项目测试,全返回大写属性了