# No Dialect mapping for JDBC type 錯誤分析和解決方法 出現這個問題可能的原因: 1、資料庫欄位型別和JAVA型別不匹配。 2、Hibernate中錯誤地配置了資料庫方言。 ## 解決方法: **檢視java.sql.Types找到對應的型別。** | 型別| 錯誤代碼 | | -------- |--------| |ARRAY | 2003 BIGINT | -5 BINARY | -2 BIT | -7 BLOB | 2004 BOOLEAN | 16 CHAR | 1 CLOB | 2005 DATALINK | 70 DATE | 91 DECIMAL | 3 DISTINCT | 2001 DOUBLE | 8 FLOAT | 6 INTEGER | 4 JAVA_OBJECT | 2000 LONGNVARCHAR | -16 LONGVARBINARY | -4 LONGVARCHAR | -1 NCHAR | -15 NCLOB | 2011 NULL | 0 NUMERIC | 2 NVARCHAR | -9 OTHER | 1111 REAL | 7 REF | 2006 ROWID | -8 SMALLINT | 5 SQLXML | 2009 STRUCT | 2002 TIME | 92 TIMESTAMP | 93 TINYINT | -6 VARBINARY | -3 VARCHAR | 12 **根據此表格可查出是資料庫中哪一種型別不匹配。 找到相對應缺少的再加進去即可** ```\ import java.sql.Types; import org.hibernate.dialect.SQLServerDialect; import org.hibernate.type.StandardBasicTypes; public class MySQLServerDialect extends SQLServerDialect{ public MySQLServerDialect () { super(); registerColumnType(Types.CHAR,"nchar(1)"); registerColumnType(Types.LONGVARCHAR,"nvarchar(max)"); registerColumnType(Types.VARCHAR,4000,"nvarchar($ l)"); registerColumnType(Types.VARCHAR,"nvarchar(max)"); registerColumnType(Types.CLOB,"nvarchar(max)"); registerColumnType(Types.NCHAR,"nchar(1)"); registerColumnType(Types.LONGNVARCHAR,"nvarchar(max)"); registerColumnType(Types.NVARCHAR,4000,"nvarchar($ l)"); registerColumnType(Types.NVARCHAR,"nvarchar(max)"); registerColumnType(Types.NCLOB,"nvarchar(max)"); registerHibernateType(1, "string"); registerHibernateType(-9, "string"); registerHibernateType(-15, "string"); registerHibernateType(-16, "string"); registerHibernateType(3, "double"); registerHibernateType(Types.CHAR, StandardBasicTypes.STRING.getName()); registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName()); registerHibernateType(Types.NCHAR, StandardBasicTypes.STRING.getName()); registerHibernateType(Types.LONGNVARCHAR, StandardBasicTypes.STRING.getName()); registerHibernateType(Types.DECIMAL, StandardBasicTypes.DOUBLE.getName()); //registerHibernateType(Types.NCHAR,StandardBasicTypes.CHARACTER.getName()); //registerHibernateType(Types.LONGNVARCHAR,StandardBasicTypes.TEXT.getName()); //registerHibernateType(Types.NVARCHAR,StandardBasicTypes.STRING.getName()); //registerHibernateType(Types.NCLOB,StandardBasicTypes.CLOB.getName()); } } ``` **然後修改Hibernate配置文件,將dialect指向自定義的dialect** ```\ <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="com.greatmap"/> <property name="hibernateProperties"> <props> 這裡指向自己設定的Dialect位置 <prop key="hibernate.dialect">com.modules.sys.utils.MySQLServerDialect</prop> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> <prop key="net.sf.ehcache.configurationResourceName">${hibernate.ehcache.configFile}</prop> <prop key="hibernate.cache.use_second_level_cache">false</prop> <prop key="hibernate.cache.use_query_cache">false</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> </props> </property> </bean> ```