JdbcTemplate的queryForObject-方法
今天在开发中使用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)); }
本文作者:漆原Blog
本文链接:https://www.cnblogs.com/7moon/p/13679150.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步