版本说明

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>

配置达梦数据库连接

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

程序之前用的oracle19C,之前语法有 select A as name的语法,在oralce下,统一返回大写NAME,但是转为达梦数据库后发现select A as name ,结果也返回小写的name了,需要改为select A as NAME ,才会返回大写,整个系统很多地方都是写的小写的字段名,这样改造工作量很大,下面记录下全局修改的方式

重写hibernate方言转换字段大小写(代码层面实现)

MyDmUpperCaseDialect.java

package org.hibernate.dialect;


import org.hibernate.type.StringType;

import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;


/**
 * @description: 自定义达梦方言:强制将 ResultSet 中的列别名转为大写
 * @date: 2026/2/6
 * @author: gaom
 * @version: 1.0
 */

public class MyDmUpperCaseDialect extends DmDialect {

    public MyDmUpperCaseDialect() {
        super();
        // 如果有特殊类型映射,可在此注册
        registerHibernateType(Types.OTHER, StringType.INSTANCE.getName());
    }

    @Override
    public ColumnAliasExtractor getColumnAliasExtractor() {
        return UpperCaseColumnAliasExtractor.INSTANCE;
    }

    private static class UpperCaseColumnAliasExtractor implements ColumnAliasExtractor {
        public static final UpperCaseColumnAliasExtractor INSTANCE = new UpperCaseColumnAliasExtractor();

        @Override
        public String extractColumnAlias(ResultSetMetaData resultSetMetaData, int column) throws SQLException {
            // 获取列标签(通常是别名),并转为大写
            String label = resultSetMetaData.getColumnLabel(column);
            return label != null ? label.toUpperCase() : "";
        }
    }
}

修改配置文件使用重写的方言

# 方言
cytjdb.dialect=org.hibernate.dialect.MyDmUpperCaseDialect

修改后重启项目测试,全返回大写属性了

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐