Spring jdbcTemplate.queryForList 报错:Incorrect column count:expected 1, actual 7

问题描述

记录一个坑,在工程之前封装了Dao层,时间过得有点久了,使用的时候遇到了一个报错信息

Caused by: org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 7

// 封装代码
public <T> List<T> queryForListClassType(String sql, Class<T> classType, Object... objects) {
        logger.debug("sql>>>" + sql + ",objects>>>" + getParasLog(objects));
        DBContextHolder.setDBType(DatabaseConfig.DATA_SOURCE_READER);
        return jdbcTemplate.queryForList(sql, classType, objects);
    }
   
 //调用代码
 String sql = "select * from t_pay_sandbox_user" where deleted ='0'";
 List<SandBoxUser> users = queryForListClassType(sql, SandBoxUser.class, null); 

比较坑的是,编译时通过的,并没有报错,但是 jdbcTemplate.queryForList 这个方法的实现接收的是一个基础的类型和String类型,getSingleColumnRowMapper 就是只能结果是只能有一列,

	@Override
	public <T> List<T> queryForList(String sql, Class<T> elementType, @Nullable Object... args) throws DataAccessException {
		return query(sql, args, getSingleColumnRowMapper(elementType));
	}

解决方案

使用 jdbcTemplate.query 方法,封装Dao层如下,这样就可以把查询的结果映射到传入的Class类中了

    public <T> List<T> queryForListEntityClass(String sql, Class<T> entityClass, Object... objects) {
        logger.debug("sql>>>" + sql + ",objects>>>" + getParasLog(objects));
        DBContextHolder.setDBType(DatabaseConfig.DATA_SOURCE_READER);
        return jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(entityClass), objects);
    }