转载  

当在hibernate中运用原始的sql语句进行操作的的时候,常常会报错,错误很多都是关于
No Dialect mapping for JDBC type类型的错误,经过分析和查找,问题常常发生在几个地方
1、错误的配置了hibernate的方言

2、就是你的数据库中的字段和java里面的类型不匹配的问题

查找原因:通过查询hibernate的源码,找到问题的根本所在,就是hibernate中不支持对应的数据类型,具体数据类型的值,请查看下表

查看 java.sql.Types 类,可以找到对应类型,调整相应的数据库里的类型,或者其他支持这个类型的方言。

3ccbe6e1-4bf0-394c-8388-f0b1fea0018f.jpg


Java数据类型 Hibernate数据类型 标准SQL数据类型
(PS:对于不同的DB可能有所差异)
byte、java.lang.Byte byte TINYINT
short、java.lang.Short short SMALLINT
int、java.lang.Integer integer INGEGER
long、java.lang.Long long BIGINT
float、java.lang.Float float FLOAT
double、java.lang.Double double DOUBLE
java.math.BigDecimal big_decimal NUMERIC
char、java.lang.Character character CHAR(1)
boolean、java.lang.Boolean boolean BIT
java.lang.String string VARCHAR
boolean、java.lang.Boolean yes_no CHAR(1)('Y'或'N')
boolean、java.lang.Boolean true_false CHAR(1)('Y'或'N')
java.util.Date、java.sql.Date date DATE
java.util.Date、java.sql.Time time TIME
java.util.Date、java.sql.Timestamp timestamp TIMESTAMP
java.util.Calendar calendar TIMESTAMP
java.util.Calendar calendar_date DATE
byte[] binary VARBINARY、BLOB
java.lang.String text CLOB
java.io.Serializable serializable VARBINARY、BLOB
java.sql.Clob clob CLOB
java.sql.Blob blob BLOB
java.lang.Class class VARCHAR
java.util.Locale locale VARCHAR
java.util.TimeZone timezone VARCHAR
java.util.Currency currency VARCHAR

解决办法:

(1)写个类继承SQLServerDialect,注册类型映射

[java]
  1. package com.xuedou.skyedu.util;  

  2. import java.sql.Types;  

  3. import org.hibernate.Hibernate;  

  4. import org.hibernate.dialect.SQLServerDialect;  

  5. /**

  6. * 注册nvarchar类型映射

  7. */

  8. publicclass SkySQLServerDialect extends SQLServerDialect{  

  9. public SkySQLServerDialect() {  

  10. super(); //调用父类的构造方法(super()一定要放在方法的首个语句)

  11.        registerHibernateType(Types.NVARCHAR, Hibernate.STRING.getName());  

  12.    }  

  13. }  

(2)配置hibernate文件,修改为

[html]
  1. hibernate.dialect=com.xuedou.skyedu.util.SkySQLServerDialect