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