hibernate查询报错之No Dialect mapping for JDBC type -9
从错误可以看出是没有方言映射到JDBC的类型,由于使用的是Hibernate映射的数据库方言,且查询数据库字段是NVARCHAR2()类型的,原因就是是NVARCHAR2()类型映射不到Java数据类型。
通过查看hibernate 源码发现,跟踪Dialect源代码发现并没有对Nvarchar类型做处理,那么我们自己处理一下即可
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
说明我们自义定的方言实现已经加载,至此,问题已经解决
各种参数对照表如下