美文网首页Java 杂谈
使用JdbcTemplate遇到的坑

使用JdbcTemplate遇到的坑

作者: He_Yifeng | 来源:发表于2018-11-29 19:30 被阅读11次

    今天项目中导数据,项目集成的是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.png

    好在JdbcTemplate还有个query()方法,给你想要返回的(即自己封装的dto)加上一层映射即可,使用:

    new BeanPropertyRowMapper(Class<T> clazz)
    
    List<DataToCompany> list = jdbcTemplate.query(sb.toString(), new BeanPropertyRowMapper(DataToCompany.class));
    

    相关文章

      网友评论

        本文标题:使用JdbcTemplate遇到的坑

        本文链接:https://www.haomeiwen.com/subject/pvxqcqtx.html