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 mapper = BeanPropertyRowMapper.newInstance(User.class);
jdbcTemplate.queryForObject(SQL,new Object[]{id},mapper);

问题的原因

第一次看到queryForObject(String sql, Object[] args, int[] argTypes, Class 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类了。

你可能感兴趣的:(Java,spring)