No Dialect mapping for JDBC type: -1;

当遇到'No Dialect mapping for JDBC type: -1'的错误时,通常是由于Hibernate无法识别特定的JDBC类型。解决方法是创建一个自定义的Dialect类,将未映射的类型手动添加进去。例如,可以注册 Hibernate.STRING 来处理这类异常类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统报错:

No Dialect mapping for JDBC type: -1; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: -1

 

好几次碰到这个问题,每次都匆匆忙忙的解决了,这个写个东西记录下来,以后直接用。

 

一看见Dialect就知道这个Hibernate的方言出问题了,这个-1不在它原有的范围之内,需要手动加上去。

 

1、新建一个Class文件,里面添加上报错的类型,如:

package com.wjl.sqldialect;

import java.sql.Types;

import org.hibernate.Hibernate;
import org.hibernate.dialect.SQLServerDialect;

public class SqlServer2008Dialect extends SQLServerDialect {
	public SqlServer2008Dialect() {
		super();
		//JDBC type:1
		registerHibernateType(Types.CHAR, Hibernate.STRING.getName());
		
		//JDBC type:-9
		registerHibernateType(Types.NVARCHAR, Hibernate.STRING.getName());
		
		//JDBC type:-16
		registerHibernateType(Types.LONGNVARCHAR, Hibernate.STRING.getName());
		
		//JDBC type:3
		registerHibernateType(Types.DECIMAL, Hibernate.DOUBLE.getName());
		
		//JDBC type:-1
		registerHibernateType(Types.LONGVARCHAR, Hibernate.STRING.getName());  
	}
}

 

 2、将配置文件中的Dialect配置上面写的那个,即:

<property name="hibernateProperties">
	<props>
		<prop key="hibernate.dialect">
				org.hibernate.dialect.SQLServerDialect
		</prop>
		<prop key="hibernate.show_sql">true</prop>
	</props>
</property>

//替换成
<property name="hibernateProperties">
	<props>
		<prop key="hibernate.dialect">
				com.wjl.sqldialect.SqlServer2008Dialect
		</prop>
		<prop key="hibernate.show_sql">true</prop>
	</props>
</property>

 至于上面那些数据,-1,-9,-16,3什么的,它们都是java.sql.Types维护的一些常量,主要有以下这些(摘自JDK1.6帮助文档):

public static final intARRAY2003
public static final intBIGINT-5
public static final intBINARY-2
public static final intBIT-7
public static final intBLOB2004
public static final intBOOLEAN16
public static final intCHAR1
public static final intCLOB2005
public static final intDATALINK70
public static final intDATE91
public static final intDECIMAL3
public static final intDISTINCT2001
public static final intDOUBLE8
public static final intFLOAT6
public static final intINTEGER4
public static final intJAVA_OBJECT2000
public static final intLONGNVARCHAR-16
public static final intLONGVARBINARY-4
public static final intLONGVARCHAR-1
public static final intNCHAR-15
public static final intNCLOB2011
public static final intNULL0
public static final intNUMERIC2
public static final intNVARCHAR-9
public static final intOTHER1111
public static final intREAL7
public static final intREF2006
public static final intROWID-8
public static final intSMALLINT5
public static final intSQLXML2009
public static final intSTRUCT2002
public static final intTIME92
public static final intTIMESTAMP93
public static final intTINYINT-6
public static final intVARBINARY-3
public static final intVARCHAR12
所以每次报错说是哪个数字时,直接到JDK帮助文档上找到这些常量,找到对应的直接添加到SqlServer2008Dialect类中就成。
譬如报错-1,对应于Types中的LONGVARCHAR,就在SqlServer2008Dialect添加一句:
registerHibernateType(Types.LONGVARCHAR, Hibernate.STRING.getName());

要是报错的数字没有包含在Types中(可能性不大),就直接写上数字,告诉Hibernate用String来处理这种类型,也就是:

registerHibernateType(@报错数字, Hibernate.STRING.getName());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值