1、背景
项目有个功能是删除数据1的同时要删除关联数据2,删除1前会查询数据2的id,使用的语法就是
namedParameterJdbcTemplate.query(sqlBuilder.toString(), params, BeanPropertyRowMapper.newInstance(String.class))
2、分析
- 如上语法中RowMapper使用的BeanPropertyRowMapper.newInstance(String.class)
- 但是断点后提取的sql语句在数据能查询出数据,代码namedParameterJdbcTemplate.query却查询不到具体数据,可以看到能够查到有一条数据,但是查询不到具体的值
- 更换一种查询方式却能查询到具体的数据
- 继续分析,查看BeanPropertyRowMapper.newInstance源码可以看到这里必须有写方法才能给字段赋值,而String.class类是没有写方法的,没办法赋值
- 打断点查看,当要转成的类型使用String.class时确实不存在writeMethod
3、总结
- 综上BeanPropertyRowMapper.newInstance个人认为只适合查询转为对象类的,并不适合基础类型,如String
- 如果需要查询非对象结果的建议更换使用org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate#queryForList(java.lang.String, org.springframework.jdbc.core.namedparam.SqlParameterSource, java.lang.Class)
- 特此记录,避免再次踩坑