hibernate查询报错之No Dialect mapping for JDBC type -9

从错误可以看出是没有方言映射到JDBC的类型,由于使用的是Hibernate映射的数据库方言,且查询数据库字段是NVARCHAR2()类型的,原因就是是NVARCHAR2()类型映射不到Java数据类型。

我们项目中使用的数据库是orcale 12c的,通过查看hibernate源码发现Orcale12cDialect继承10,然后10继承9,跟踪源代码发现并没有对Nvarchar类型做处理,那么我们自己处理一下即可

首先我们创建自己的一个方言类,这儿我继承自Orcale12cDialect,对需要处理的字段类型进行处理

package org.hibernate.dialect
import java.sql.Types;
import org.hibernate.type.StandardBasicTypes;
 
public class MyOracleDialect extends Oracle12cDialect
{
    public MyOracleDialect(){
        super();
        registerHibernateType(Types.CHAR, StandardBasicTypes.STRING.getName());          
        registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());        
        registerHibernateType(Types.LONGNVARCHAR, StandardBasicTypes.STRING.getName());  
        registerHibernateType(Types.DECIMAL, StandardBasicTypes.DOUBLE.getName());        
        registerHibernateType(Types.NCLOB, StandardBasicTypes.STRING.getName());
    }
}

接下来我们新增配置文件,由于项目架构使用的springcloud,那么就方便了,在自己的项目中的resource文件夹下新建hibernate.properties文件,里面新增一行代码,重新指定我们的自定义方言类

hibernate.dialect = org.hibernate.dialect.MyOrcaleDialect

项目启动测试,问题解决

解决问题的思路,我们没有新增hibernate.properties文件之前,项目启动的时候我们会发现一行日志,启动时会默认去寻找我们自定义的hibernate.properties文件,如果找不到,使用默认的Oracle12cDialect类,在Environment.class文件中进行了自定义配置文件的读取,然后在Orcale12cDialect顶层父类Dialect中读取配置文件中hibernate.dialect配置项,这些查看源码都可以看到

[2020-12-14 10:25:21]org.hibernate.cfg.Environment HHH000206: hibernate.properties not found
[2020-12-14 10:25:21]org.hibernate.cfg.Environment HHH000021: Bytecode provider name : javassist
[2020-12-14 10:25:21]org.hibernate.annotations.common.Version HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
[2020-12-14 10:25:22]com.alibaba.druid.pool.DruidDataSource {dataSource-1} inited
[2020-12-14 10:25:22]org.hibernate.dialect.Dialect HHH000400: Using dialect: org.hibernate.dialect.Oracle12cDialect

当我们新增了配置项后重新启动时,我们在启动日志里面可以看到已经加载了我们自定义的配置项

[2020-12-14 11:57:41]org.hibernate.cfg.Environment HHH000205: Loaded properties from resource hibernate.properties: {hibernate.dialect=org.hibernate.dialect.MyOracleDialect, hibernate.bytecode.use_reflection_optimizer=false}
[2020-12-14 11:57:41]org.hibernate.cfg.Environment HHH000021: Bytecode provider name : javassist
[2020-12-14 11:57:42]org.hibernate.annotations.common.Version HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
[2020-12-14 11:57:43]com.alibaba.druid.pool.DruidDataSource {dataSource-1} inited
[2020-12-14 11:57:43]org.hibernate.dialect.Dialect HHH000400: Using dialect: org.hibernate.dialect.MyOracleDialect

说明我们自义定的方言实现已经加载,至此,问题已经解决

各种参数对照表如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值