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));
        }
    


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM