No Dialect mapping for JDBC type: -1

hibernate中使用sql语句进行查询,后台报错
No Dialect mapping for JDBC type: -1; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
查询了一下说是查询的数据中使用了hibernate不支持的数据类型,就是说hibernate没有注册该类型,查看java.sql.Types维护的一些常量根据报错的数据来查看是哪个类型出错,-1即LONGVARCHAR类型出错。

No Dialect mapping for JDBC type: -1_第1张图片

解决方法1

写一个Dialect的子类,这里因为我使用MySQL数据库所以 extends MySQL5Dialect类,

package com.aerors.config;

import java.sql.Types;

import org.hibernate.Hibernate;
import org.hibernate.dialect.MySQL5Dialect;   
public class DialectForInkfish extends MySQL5Dialect {   
    public DialectForInkfish() {   
        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()); 
    }   
} 

修改Hibernate配置文件hibernate.cfg.xml,把

org.hibernate.dialect.MySQL5Dialect   

修改为:

com.aerors.config.DialectForInkfish  

JDBC type为1,-9,-16,3等其他值时,也可以添加对其错误码对应的的数据类型的支持。

解决方法二

抛弃sql语句查询,改为HQL语句查询

解决方法三

使用CONVERT函数,将text转成varchar,简单方便

CONVERT(varchar(100), isnull(dateTime, '')) 

dateTime是text类型变量名,isnull函数判断下是否为空,一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)
相互转换的时候才用到。

你可能感兴趣的:(hibernate)