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

一、发现问题:

在我的项目中,运用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 细节处看问题

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值