org.springframework.jdbc.IncorrectResultSetColumnCountException

问题描述

在使用 JdbcTemplatequeryForObject(String sql, Object[] args, int[] argTypes, Class requiredType) 方法时抛出异常:

org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 4

解决办法(spring 4.x)

使用方法 **queryForObject(String sql, @Nullable Object[] args, RowMapper rowMapper)**代替:

RowMapper<User> mapper = BeanPropertyRowMapper.newInstance(User.class);
jdbcTemplate.queryForObject(SQL,new Object[]{id},mapper);

问题的原因

第一次看到queryForObject(String sql, Object[] args, int[] argTypes, Class<T> requiredType)这个方法的时候,我习惯性地认为它是用于根据requiredType返回相应类型实体的,无论传入什么样的pojo类型,它都能返回一个正确的结果。实际上这个方法的初衷不是这样的,它只适用于数据库查询结果只有一列的情况。
举个例子:

String sql = "SELECT age FROM user WHERE id = ?"
int age = jdbcTemplate.queryForObject(sql,new Object[]{1},Integer.class);
System.out.println(age);

这条sql语句查询的结果只有一列(age),requiredType为Integer.class,对应的即是age的类型。可以看到当查询结果只有一列时,这个方法是可以正常运行并返回我们想要的结果的。
如果查询的结果有多列,并且我们希望得到一个pojo的实例,则需要借助RowMapper类了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值