轉載 http://blog.csdn.net/goddessming/article/details/8853891html
當在hibernate中運用原始的sql語句進行操做的的時候,經常會報錯,錯誤不少都是關於
No Dialect mapping for JDBC type類型的錯誤,通過分析和查找,問題經常發生在幾個地方
一、錯誤的配置了hibernate的方言
java
二、就是你的數據庫中的字段和java裏面的類型不匹配的問題sql
查找緣由:經過查詢hibernate的源碼,找到問題的根本所在,就是hibernate中不支持對應的數據類型,具體數據類型的值,請查看下錶
數據庫
查看 java.sql.Types 類,能夠找到對應類型,調整相應的數據庫裏的類型,或者其餘支持這個類型的方言。 app
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 |
解決辦法:ide
(1)寫個類繼承SQLServerDialect,註冊類型映射ui
package com.xuedou.skyedu.util; url
import java.sql.Types; spa
import org.hibernate.Hibernate; .net
import org.hibernate.dialect.SQLServerDialect;
/**
* 註冊nvarchar類型映射
*/
publicclass SkySQLServerDialect extends SQLServerDialect{
public SkySQLServerDialect() {
super(); //調用父類的構造方法(super()必定要放在方法的首個語句)
registerHibernateType(Types.NVARCHAR, Hibernate.STRING.getName());
}
}
(2)配置hibernate文件,修改成
hibernate.dialect=com.xuedou.skyedu.util.SkySQLServerDialect