今天遇到一个错误在使用Hibernate的时候,使用createSQLQuery获取数据。
Query query = getSession().createSQLQuery(String.format("select rulestr,rultype from asr_rule where rulcode='%s'", baseRuleCode));
for (Object item : query.list()) {
...
}
for (Object item : query.list()) {
...
}
在query.list()时就出错了:No Dialect mapping for JDBC type:-1
意思大概是没有与jdbc类型对应的方言。
在数据库中把跟踪到的SQL运行一下,是成功的。根据提示看,rulestr是text类型的,rultype是int类型的,应该不会是rultype的问题,而是rulestr的问题。经过搜索,找到解决方法如下:
1、继承一下MySQLDialect,注册text类型:
public class MySqlDialectEx extends MySQLDialect {
public MySqlDialectEx() {
super();
registerHibernateType(Types.LONGVARCHAR, "text");
}
}
public MySqlDialectEx() {
super();
registerHibernateType(Types.LONGVARCHAR, "text");
}
}
2、beans.xml中配置方言为刚才写的MySqlDialectEx.
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.dialect">org.vsem.MySqlDialectEx</prop>
</props>
</property>
<props>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.dialect">org.vsem.MySqlDialectEx</prop>
</props>
</property>