今天在開發中使用JdbcTemplate.queryForObject()
方法,報了以下錯誤。
//方法調用
YljaBaseOrganize baseOrgnaize=jdbcTemplate.queryForObject(sql.toString(),params,mapper);
//異常信息(不正確的結果大小,預期是1,實際為2)
org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 2
Spring源碼:
@Nullable
public <T> T queryForObject(String sql, @Nullable Object[] args, RowMapper<T> rowMapper) throws DataAccessException {
List<T> results = (List)this.query((String)sql, (Object[])args, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper, 1)));
return DataAccessUtils.nullableSingleResult(results);
}
@Nullable
public static <T> T nullableSingleResult(@Nullable Collection<T> results) throws IncorrectResultSizeDataAccessException {
if (CollectionUtils.isEmpty(results)) {
throw new EmptyResultDataAccessException(1);
} else if (results.size() > 1) {
throw new IncorrectResultSizeDataAccessException(1, results.size());
} else {
return results.iterator().next();
}
}
通過閱讀該方法源碼得知,queryForObject()
方法會調用同類下的nullableSingleResult()
方法進行查詢結果校驗,當結果集大於或等於0時,會拋出相應的異常信息。
解決方法:
-
修改數據庫,刪除數據庫中對應字段的重復記錄,保證查詢結果始終為1
-
調用其他方法,使用
jdbcTemplate.query()
方法返回查詢結果集合(該方法在查詢出多條或0條數據時不會報錯)//查詢參數 Object[] params = new Object[]{orgMc,companyId,orgMc}; RowMapper<YljaBaseOrganize> mapper = BeanPropertyRowMapper.newInstance(YljaBaseOrganize.class); //查詢出相應的結果集 List<YljaBaseOrganize> baseOrgnaizes = jdbcTemplate.query(sql.toString(), params, mapper);
BeanPropertyRowMapper
:當查詢數據庫返回的是多列數據,且需要將多列數據映射到某個實體類上,那么就該使用這個RowMapper。使用示例:
@Override public Student getStudentByName2(String name) { String sql = "select name, gender from test_student where name = ?"; return this.jdbcTemplate.queryForObject(sql, new Object[]{name}, new BeanPropertyRowMapper<>(Student.class)); } @Override public List<Student> getStudentsByName2(String name) { String sql = "select name, gender from test_student where name = ?"; return this.jdbcTemplate.query(sql, new Object[]{name}, new BeanPropertyRowMapper<>(Student.class)); }