JdbcTemplate.queryForList()或queryForObject报错Incorrect column count: expected 1, actual 2

原因是queryForList()与queryForObject()这两个方法一般情况下只返回单一列的数据,不能反悔复杂的数据对象。比如有实体类user,就会报错。

public class User(){
    private String name;
    privtae Stirng sex;
}

看源码可以发现反悔的确实只会是单一列的数据:

@Nullable
    public <T> T queryForObject(String sql, SqlParameterSource paramSource, Class<T> requiredType) throws DataAccessException {
        return this.queryForObject(sql, (SqlParameterSource)paramSource, (RowMapper)(new SingleColumnRowMapper(requiredType)));
    }
public <T> List<T> queryForList(String sql, SqlParameterSource paramSource, Class<T> elementType) throws DataAccessException {
        return this.query(sql, (SqlParameterSource)paramSource, (RowMapper)(new SingleColumnRowMapper(elementType)));
    }

    public <T> List<T> queryForList(String sql, Map<String, ?> paramMap, Class<T> elementType) throws DataAccessException {
        return this.queryForList(sql, (SqlParameterSource)(new MapSqlParameterSource(paramMap)), elementType);
    }

如果想要返回自定义的复杂对象怎么办呢?使用query方法或者public List<Map<String, Object>> queryForList方法

但是我们可以看到其实public List<Map<String, Object>> queryForList方法也是调用的query方法。

public List<Map<String, Object>> queryForList(String sql, SqlParameterSource paramSource) throws DataAccessException {
        return this.query(sql, (SqlParameterSource)paramSource, (RowMapper)(new ColumnMapRowMapper()));
    }

    public List<Map<String, Object>> queryForList(String sql, Map<String, ?> paramMap) throws DataAccessException {
        return this.queryForList(sql, (SqlParameterSource)(new MapSqlParameterSource(paramMap)));
    }

想要调用query方法返回List<User>还需要实现RowMapper接口,代码如下:

@Getter
@Setter
public class User implements RowMapper{

    private String name;

    private String sex;

    @Nullable
    @Override
    public User mapRow(ResultSet resultSet, int i) throws SQLException {
        User user = new User();
        // 这里的序号是列的序号,以1开始
        user.setName(resultSet.getString(1));
        user.setSex(resultSet.getString(2));
        return user;
    }
}

这样就可以获取到想要的List了

JdbcTemplate.query("select *  from user", new User());

使用MyBatis习惯之后,惯性思维看到queryForList就以为会是自己想要的功能,查了很久才发现原来是这个错误,以后遇到问题还是要仔细看源码。

微信公众号:二虎程序

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 误代码"IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 9"表示查询结果的列数与期望的列数不匹配。根据引用\[1\]中的误代码,可以看出在使用jdbcTemplate.queryForList方法时,期望返回一个列,但实际返回了9列。这可能是因为在查询语句中选择了多个列,而该方法只能返回一个列的结果。正确的做法是使用jdbcTemplate.query方法,并指定一个自定义的类型,如引用\[2\]中的示例代码所示。在这个示例中,使用了BeanPropertyRowMapper来映射查询结果到Book对象,并通过指定参数来限制查询结果只返回一个对象。另外,根据引用\[3\]中的解决方法,可以使用jdbcTemplate.query方法并指定一个自定义的类型来执行查询并返回结果。 #### 引用[.reference_title] - *1* *3* [jdbcTemplate.queryForList 误 spring-org.springframework.jdbc....](https://blog.csdn.net/qq_39393805/article/details/82887952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用JdbcTemplate Incorrect column count: expected 1, actual 9误解决](https://blog.csdn.net/qq_43483348/article/details/124478727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值