您的位置:首页 > 移动开发

org.hibernate.MappingException: No Dialect mapping for JDBC type: -9【问题发现与解决】

2016-08-12 14:05 495 查看
一、发现问题:

在我的项目中,运用SpringMVC框架。因为直接查询视图,数据较多,响应时间很慢。于是,运用左连接查询数据库取需要的字段属性,存到一个实体类中。

于是用Hibernate的Query query = session.createSQLQuery(sql);来查询数据库,并存放到List<Object>中List<Object> list = query.list();具体实现如下:

String sql = "select tcomplainhandle.complainID,tcomplainhandle.manageRemark,tcomplainhandle.manageDate,tcustomlogininfo.realname from tcomplainhandle
left join tcustomlogininfo on tcomplainhandle.managerID=tcustomlogininfo.id where complainID="+complainId;
Session session = sessionFactory.getCurrentSession();
Query query = session.createSQLQuery(sql);

List<Object> list = query.list();
List<BasicComplainHandle> bchList = new ArrayList<BasicComplainHandle>();
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
Object[] obj = new Object[4];
obj = (Object[]) list.get(i);
BasicComplainHandle bch = new BasicComplainHandle();
bch.setComplainId(((BigInteger)obj[0]).longValue());
bch.setManageRemark((String)obj[1]);
bch.setManageDate((String)obj[2]);
bch.setRealname((String)obj[3]);
bchList.add(bch);
}
}
if(bchList != null && bchList.size() > 0){
return bchList;
}
return null;

   事情没有预料的那么轻松,List<Object> list = query.list();这里一直报错,并跳转到AopUtils文件异常中:

try {
ReflectionUtils.makeAccessible(method);
return method.invoke(target, args);
}
catch (InvocationTargetException ex) {
// Invoked method threw a checked exception.
// We must rethrow it. The client won't see the interceptor.
throw ex.getTargetException();
}

 eclipse控制台报错:org.hibernate.MappingException: No Dialect mapping for JDBC type: -9

二 解决过程:

    1 将这个异常粘贴到度娘,去查询,找不到可用的任何结果。

    2 于是在DaoImpl中写测试的数据库查询,例如:select * from tcomplainhandle 、select manageDate from tcomplainhandle,都没有任何进展。

    3 换成Hql语句查询试一下:Query query = session.createQuery(hql); 发现能够正常接收数据。

    4 继续写原生的sql语句,换表试试,例如:select * from torder  select * from tloginfo select * from tretail 等,反正写了七八个,发现只有tloginfo和tcomplainhandle报一样的错误

三 总结并解决

 A 为什么度娘能够查到 No Dialect mapping for JDBC type: 3; JDBC type:-1,Dialect是什么意思

 B 为什么单独tloginfo和tcomplainhandle有问题,其他没有问题。

于是去找一下这两个表和其他表的逻辑设计有何不同,仔细看,反复对比,发现两个表都有nvchar(MAX)这个类型

再去看spring.xml配置,查看SqlServer2012的方言配置:

<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>

没有任何问题,于是判定问题就出在这个字段类型上。把nvchar(MAX)改成varchar(255)解决问题。 原来hibernate3.6.9找不到这种方言

综上可以看出解决问题的套路:1debug 2 度娘 3查看api 4 对比个例和总体的区别 5 细节处看问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate spring mvc
相关文章推荐