今天项目中导数据,项目集成的是JPA,但由于获取数据用到了很多关联等原因,所以在获取数据的时候我用了JdbcTemplate,但就是这个,我遇到了一个坑。
JdbcTemplate有个queryForList()方法,返回的是List,但返回的标准格式是List<Map<String,Object>>这个玩意,而我需要返回的是类似与List<Company>这样的,如果返回上面的就需要经过转换,而且数据又有接近百万条,所以想直接就获取出来,所以去看了一下JdbcTemplate的方法源码,看到:
public <T> List<T> queryForList(String sql, Class<T> elementType) throws DataAccessException {
return this.query(sql, this.getSingleColumnRowMapper(elementType));
}
可以看到这个方法可以指定一个泛型的类,会自动转换,进坑了,一运行就:
ERROR [com.ruhuiyun.studentmanager.aop.LogAdvice]
- org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 8:
Incorrect column count: expected 1, actual 8
报错了, 异常很明了,需要一个,给人家整成了八个,也就是人家不是存List的。一查原来Class<T>只支持单数据类型,例如String、Integer,对于自己定义的Bean不支持:
好在JdbcTemplate还有个query()方法,给你想要返回的(即自己封装的dto)加上一层映射即可,使用:
new BeanPropertyRowMapper(Class<T> clazz)
List<DataToCompany> list = jdbcTemplate.query(sb.toString(), new BeanPropertyRowMapper(DataToCompany.class));