今天写原生态SQL调用Hibernate查询数据库报以下异常:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 。
原因:肯定是方言(Hibernate Dialect)的问题,Hibernate映射时发现实体类的类型与数据库中的类型对应不上。
例如:你用了MYSQL,并定义一个字段值类型为decimal,此时通过hibernate原生态查询就会报异常:
No Dialect mapping for JDBCtype: 3.
如果你用了SQLSERVER,并定义字段类型为:max,将会报异常:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 。
解决:自定义方言,写一个JAVA类,继承所对应的数据库方言,找你要重写的字段。
MSSQL:
<span style="color:#000000;">import java.sql.Types;
import org.hibernate.Hibernate;
/**
* Hibernate方言问题,当varchar为max时无法映射!
* SQLServerDialect.
*/
public class SQLServerDialect extends org.hibernate.dialect.SQLServerDialect{
public SQLServerDialect(){
super();
registerHibernateType(Types.LONGVARCHAR, Hibernate.TEXT.getName());
}
}</span>
application:
指定你写的方言类。
<span style="color:#000000;"><bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<value>
hibernate.dialect=com.xxx.framework.util.SQLServerDialect
hibernate.show_sql=true hibernate.jdbc.batch_size=50
hibernate.hbm2ddl.auto=update
</value>
</property>
</bean></span>