因为每个数据库都有各自的方言,而方言简单理解来说其实就是对某些数据库独有的数据类型,函数之类的做一个映射关系,而1111就是因为不存在映射关系,所以找不到方言对应值
package org.hibernate.dialect;
public final class TypeNames {
public String get(final int typeCode) throws MappingException {
final Integer integer = Integer.valueOf( typeCode );
final String result = defaults.get( integer );
if ( result == null ) {
throw new MappingException( "No Dialect mapping for JDBC type: " + typeCode );
}
return result;
}
...
}
从上面的代码来看,typeCode为1111的时候,defaults中不存在key为1111的值,并不存在映射,所以抛出异常
package org.hibernate.dialect;
public abstract class Dialect implements ConversionContext {
protected Dialect() {
// standard sql92 functions (can be overridden by subclasses)
registerFunction( "substring", new SQLFunctionTemplate( StandardBasicTypes.STRING, "substring(?1, ?2, ?3)" ) );
registerFunction( "locate", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "locate(?1, ?2, ?3)" ) );
registerFunction( "trim", new SQLFunctionTemplate( StandardBasicTypes.STRING, "trim(?1 ?2 ?3 ?4)" ) );
...
//map second/minute/hour/day/month/year to ANSI extract(), override on subclasses
registerFunction( "second", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "extract(second from ?1)") );
registerFunction( "minute", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "extract(minute from ?1)") );
registerFunction( "hour", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "extract(hour from ?1)") );
...
registerColumnType( Types.BIT, "bit" );
registerColumnType( Types.BOOLEAN, "boolean" );
registerColumnType( Types.TINYINT, "tinyint" );
...
// register hibernate types for default use in scalar sqlquery type auto detection
registerHibernateType( Types.BIGINT, StandardBasicTypes.BIG_INTEGER.getName() );
registerHibernateType( Types.BINARY, StandardBasicTypes.BINARY.getName() );
registerHibernateType( Types.BIT, StandardBasicTypes.BOOLEAN.getName() );
...
}
...
}
上面的代码中则是hibernate方言类中默认的映射,每个数据库有不同的映射,所以不同数据库的方言包继承于该类,进行一些独有类型的映射关系
package java.sql;
public class Types {
public final static int BIT = -7;
public final static int TINYINT = -6;
public final static int SMALLINT = 5;
public final static int INTEGER = 4;
public final static int BIGINT = -5;
public final static int OTHER = 1111;
...
}
解决方案
从上面代码中可以看出1111是other,不像是会被映射的类型
所以我们手动的去将关系对应起来,而1111代表的是什么,我们并不知道。而我是通过报错的sql找到对应的表,查看表结构中的离奇类型,然后查看是否有对应关系,没有的话就手动添加映射关系
我项目中出现的问题是kingbase的数据库中有个表的字段类型为serial,这个在方言中不存在映射关系,所以我手动的去添加了映射
public class Kingbase8Dialect extends org.hibernate.dialect.Kingbase8Dialect {
public Kingbase8Dialect() {
// 添加other的映射 即1111
this.registerHibernateType(Types.OTHER, StandardBasicTypes.BIG_INTEGER.getName());
// 一些其他的映射关系
}
}
方言设置好后,需要在hibernate配置方言
spring:
jpa:
hibernate:
ddl-auto: none
properties:
hibernate:
#dialect: org.hibernate.dialect.Kingbase8Dialect
#修改到我们自己的方言类
dialect: com.xxx.xxx.Kingbase8Dialect
至此,该问题则算被解决掉
总结有些问题,研究下,多看看源码,就可以了解问题出现的原因,从而解决问题。从我们当前这个问题来看,
我遇到并解决的只是一个 No Dialect mapping for JDBC type: 1111 的问题,但通过看源码,我们可以了解到很多衍生问题
比如以后再出现 No Dialect mapping for xxx 的问题,我们就立刻知道了是哪里的问题。
这就是我对于 No Dialect mapping for JDBC type: 1111 问题的解析以及解决方案,希望对正在观看的您有所帮助



