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