에러 모음

IncorrectResultSizeDataAccessException

junani0v0 2024. 5. 15. 22:06

< 에러 메시지 >

SEVERE: 경로 [/13]의 컨텍스트 내의 서블릿 [pf]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 3]을(를) 발생시켰습니다.

org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 3

 

IncorrectResultSizeDataAccessException

Spring 프레임워크 예외

데이터 베이스에서 쿼리를 실행할 때 유일한 결과를 반환해야하는데 여러개의 결과를 반환된 경우 발생

< 원인 >

첨부파일을 단일이아닌 복수첨부로 변경하였지만 읽어오는 페이지에서 단일 값만 읽어오기에 기대값은 1인데 실제는 3개의 값이 있어서 에러 발생

//단일 업로드 가져오기
public BoardAttachDto getAttachInfo(int boardSeq, int boardTypeSeq) {
    String sql = "SELECT * FROM board_attach ba "
            + "WHERE ba.board_seq = ? "
            + "AND ba.board_type_seq = ? ";
    Object[] args = {boardSeq, boardTypeSeq};
    return queryForObject(sql, new BoardAttachRowMapper(), args);
}

class BoardAttachRowMapper implements RowMapper<BoardAttachDto>{//하나RowMapper
		
    @Override
    public BoardAttachDto mapRow(ResultSet rs, int rowNum) throws SQLException{ 
        BoardAttachDto dto = new BoardAttachDto();
        dto.setAttachSeq(rs.getInt("attach_seq"));
        dto.setBoardSeq(rs.getInt("board_seq"));
        dto.setBoardTypeSeq(rs.getInt("board_type_seq"));
        dto.setOrgFileNm(rs.getString("org_file_nm"));
        dto.setSavePath(rs.getString("save_path"));
        dto.setChngFileNm(rs.getString("chng_file_nm"));
        dto.setFileSize(rs.getInt("file_size"));
        dto.setFileType(rs.getString("file_type"));
        dto.setAccessUri(rs.getString("access_uri"));
        dto.setRegDtm(rs.getString("reg_dtm"));

        return dto;
    }
}

< 해결 >

//다중 업로드파일 가져오기
public List<BoardAttachDto> getAttachInfo(int boardSeq, int boardTypeSeq) {
    String sql = "SELECT * FROM board_attach ba "
            + "WHERE ba.board_seq = ? "
            + "AND ba.board_type_seq = ? ";
    Object[] args = {boardSeq, boardTypeSeq};
    return query(sql, new BoardAttachListMapper(), args);
}

class BoardAttachListMapper implements ResultSetExtractor<List<BoardAttachDto>>{//하나RowMapper

    @Override
    public List<BoardAttachDto> extractData(ResultSet rs) throws SQLException, DataAccessException {
        ArrayList<BoardAttachDto> list = new ArrayList<>();

        BoardAttachDto dto = null;
        while(rs.next()) {
            dto = new BoardAttachDto();
            dto.setAttachSeq(rs.getInt("attach_seq"));
            dto.setBoardSeq(rs.getInt("board_seq"));
            dto.setBoardTypeSeq(rs.getInt("board_type_seq"));
            dto.setOrgFileNm(rs.getString("org_file_nm"));
            dto.setSavePath(rs.getString("save_path"));
            dto.setChngFileNm(rs.getString("chng_file_nm"));
            dto.setFileSize(rs.getInt("file_size"));
            dto.setFileType(rs.getString("file_type"));
            dto.setAccessUri(rs.getString("access_uri"));
            dto.setRegDtm(rs.getString("reg_dtm"));

            list.add(dto);
        }
        return list;
    }
}

BoardAttachDao의 getAttachInfo의 반환값인 queryForObject는 단일 결과만 가져옴으로 quey로 변경해야합니다

또한 Mapper도 List로 변경하여 해결

 

 

'에러 모음' 카테고리의 다른 글

NullPointerException  (0) 2024.05.17
IllegalArgumentException  (0) 2024.05.17
PropertyNotFoundException  (0) 2024.05.11
UnsatisfiedDependencyException, BeanCreationException, IllegalArgumentException  (0) 2024.05.10
CannotLoadBeanClassException  (0) 2024.05.09