Tiny Bunny [Spring] EmptyResultDataAccessException / Incorrect result size: expected 1, actual 0 - 솜님의 블로그
솜님의 블로그
카테고리
작성일
2024. 10. 22. 02:11
작성자
겨울솜사탕

 

원인 및 내용

jdbcTemplate 사용하여 DAO 작성하고 실행시키는데 발생된 오류이다.

 

- org.springframework.dao.EmptyResultDataAccessException
Incorrect result size: expected 1, actual 0

예상되는 값이 1개인데 실제로는 0개를 반환해서 발생된 오류라고 한다.

이는 queryForObject를 사용하면서 발생된 오류인데,

queryForObject는 0이나 1 초과의 행이 반환되는 경우에 에러를 발생시킨다고 한다.

(1 초과의 경우 IncorrectResultSizeDataAccessException 에러 발생)

 

 

 

해결방안

try-catch로 예외처리를 해주면 된다.

처리 후 정상적으로 구동됨을 확인!!

@Repository
public class ImageDAO {
	private final String SELECTONE = "SELECT IMAGEID, PATH, BID FROM IMAGE WHERE BID=? ORDER BY IMAGEID DESC LIMIT 1";
	private final String INSERT = "INSERT INTO IMAGE (PATH,BID) VALUES(?,?)";
	
	@Autowired
	private JdbcTemplate jdbcTemplate;

	public ImageDTO selectOne(ImageDTO imageDTO) {
		System.out.println("=====com.koreait.app.biz.image selectOne 시작");
		
		// 예외처리 하기 위해 return 값 저장할 변수 선언
		ImageDTO data = null;
		// 파라미터에 넣어 데이터를 찾을 값
		Object[] args = {imageDTO.getBid()};
		
		try {
			data = jdbcTemplate.queryForObject(SELECTONE, args, new ImageRowMapper());
			
		} catch(EmptyResultDataAccessException e){
			System.out.println("=====com.koreait.app.biz.image selectOne 예외발생");
			e.printStackTrace();
            data=null;
		}
		
		System.out.println("=====com.koreait.app.biz.image selectOne 종료");
		return data;
	}

}

class ImageRowMapper implements RowMapper<ImageDTO>{

	@Override
	public ImageDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
		ImageDTO data = new ImageDTO();
		data.setBid(rs.getInt("BID"));
		data.setImageid(rs.getInt("IMAGEID"));
		data.setPath(rs.getString("PATH"));
		return data;
	}
	
}