问题描述
在使用 JdbcTemplate的queryForObject(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类了。