java.sql.SQLException: Before start of result set

pickylemon·2024년 4월 24일
0

Exception 모음

목록 보기
2/31

에러메시지

[Request processing failed; nested exception is org.springframework.dao.TransientDataAccessResourceException: StatementCallback;
...Before start of result set; nested exception is java.sql.SQLException: Before start of result set]을(를) 발생시켰습니다.
java.sql.SQLException: Before start of result set
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64)
at com.mysql.cj.jdbc.result.ResultSetImpl.checkRowPos(ResultSetImpl.java:528)

원인

  • Before start of result set
    : resultSet을 시작하지 않아서 생긴 문제.
    즉, resultSet에 대한 이해가 부족한 상태에서 코드를 작성한게 원인. rs.next()가 필요하다.
  • ResultSet을 맨 처음 사용할 땐, rs.next()를 호출해서 커서를 이동시켜주어야 한다.

해결

//에러 발생 지점
public class MemberAuthDao extends JdbcTemplate{
...
	public MemberAuthDto getMemberAuthDto(String uri) {
		String sql = ...
		return query(sql, resultSetExtractor());
	}
    
    private ResultSetExtractor<MemberAuthDto> resultSetExtractor() { ... }
}
//Before(에러가 난 코드)
private ResultSetExtractor<MemberAuthDto> resultSetExtractor(){
		return (rs -> {
			MemberAuthDto dto = new MemberAuthDto();
			dto.setAuthSeq(rs.getInt("auth_seq"));
			dto.setMemberSeq(rs.getInt("member_seq"));
			dto.setAuthNum(rs.getString("auth_num"));
			dto.setAuthUri(rs.getString("auth_uri"));
			dto.setAuthYn(rs.getString("auth_yn"));
			dto.setRegDtm(rs.getLong("reg_dtm"));
			dto.setExpireDtm(rs.getLong("expire_dtm"));
			
			return dto;
		});
	}
//After(수정)
	private ResultSetExtractor<MemberAuthDto> resultSetExtractor(){
		return (rs -> {
			MemberAuthDto dto = null;
			while(rs.next()) {
				dto = new MemberAuthDto();
				dto.setAuthSeq(rs.getInt("auth_seq"));
				dto.setMemberSeq(rs.getInt("member_seq"));
				dto.setAuthNum(rs.getString("auth_num"));
				dto.setAuthUri(rs.getString("auth_uri"));
				dto.setAuthYn(rs.getString("auth_yn"));
				dto.setRegDtm(rs.getLong("reg_dtm"));
				dto.setExpireDtm(rs.getLong("expire_dtm"));
			}
			return dto;
		});
	}
profile
안녕하세요

0개의 댓글