今天遇到这样一个问题:用hibernate进行精确匹配查询的时候,一直出错。把查询参数去掉一个字符,即能顺利通过。刚开始还以为是hibernate在进行sql转换的的时候对匹配字段的参数进行校验,因为实体配置文件中该字段长度声明为10,而查询参数的长度刚好为11。但修改过配置文件以后问题依然存在,看了hibernate并没有去做这些参数的校验,那么问题会不会出现在jdbc上呢?想到这里便顺手些了下测试代码,发现问题确实是出现在JDBC上的。
PreparedStatement prsm = co.prepareStatement("select * from user where name= ?");
prsm.setString(1, name);
prsm.executeQuery();
数据库中name对应的字段长度定义为10,而参数中name的长度为11,这样执行查询的时候就会报类型不对匹配的问题,但是如果这些写
PreparedStatement prsm = co.prepareStatement("select * from user where name= '"+name+"'");
//prsm.setString(1, name);
prsm.executeQuery();
就能顺利通过。下面的亦能通过
PreparedStatement prsm = co.prepareStatement("select * from user where name like ?");
prsm.setString(1, name);
prsm.executeQuery();
(以上只对DB2数据库做了测试,其他的没有测试)
总结:在进行精确匹配查询的时候,一定要注意参数的长度,最好不要超过数据库对该字段的设定长度,如果底层方法包装的是PreparedStatement ,并且用setString进行参数填充的话,那么系统将抛出异样!但是如果是拼装sql,然后在执行,就不存在这样的问题。