学而不思则罔 思而不学则殆.|

漆原Blog

园龄:5年10个月粉丝:0关注:1

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 中国大陆许可协议进行许可。

posted @   漆原Blog  阅读(7708)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起