NoResultException : No entity found for query 에러 해결
2023. 1. 18. 19:19ㆍ프로젝트/[Sleeper] 수면관리 어플리케이션
728x90
프로젝트 중 요구사항 변경으로 인한 관련 처리를 하던 중 아래와 같은 에러가 발생했다.
요구사항 변경은 다음과 같다.
감사일기 하루에 2번이상 작성 가능
-> 감사일기는 하루에 1번만 작성 가능하고 만약, 같은 날 작성한 감사일기가 있다면 그 감사일기를 이어서 쓴다.
요구사항 반영
해당 날짜에 감사일기를 찾아와서 있다면, 해당 감사일기를 반환하고 없다면 그에 알맞은 응답을 반환하기로 하였다.
코드를 다 작성하고 TEST하는 중 아래와 같은 문제가 발생했다.
문제 발생
[org.springframework.dao.EmptyResultDataAccessException: No entity found for query; nested exception is javax.persistence.NoResultException: No entity found for query]
현재 상황
아래는 문제가 발생한 코드이다.
public Optional<Diary> findDiaryByDate(Long userPk, LocalDate localDate){
Diary singleResult = em.createQuery("select d from Diary d join d.user u where u.id = :userPk and d.savingDate.savingDate = :localDate", Diary.class)
.setParameter("userPk", userPk)
.setParameter("localDate", localDate)
.getSingleResult();
return Optional.ofNullable(singleResult);
}
문제 원인 및 해결 방법
문제의 원인은 getSingleResult() 메서드는 값이 있는 경우에는 값을 반환하지만, 만약 값이 없다면, 예외 (NoResultException)를 발생시는 것이다.
Throws: NoResultException – if there is no result
현재상황에서는 , Diary가 없는 경우와 있는 경우 모두 판단해야하기 때문에 아래와 같이 코드를 수정하였따.
public Optional<Diary> findDiaryByDate(Long userPk, LocalDate localDate){
List<Diary> diaries = em.createQuery("select d from Diary d join d.user u where u.id = :userPk and d.savingDate.savingDate = :localDate", Diary.class)
.setParameter("userPk", userPk)
.setParameter("localDate", localDate)
.getResultList();
return diaries.stream().findAny();
}
이렇게 되면, null값이 Optional로 감싸지기 때문에 Diary가 없는 경우와 있는 경우 모두 판단이 가능하다.
이상입니다~~!!
728x90
'프로젝트 > [Sleeper] 수면관리 어플리케이션' 카테고리의 다른 글
엔티티에 의존성 주입을 해야할까? (0) | 2023.03.08 |
---|---|
내 첫 프로젝트 Sleeper 회고록 (0) | 2023.02.11 |
에러 해결을 통해 공부하는 지연로딩과 프록시 (0) | 2023.01.18 |
Error creating bean with name 'handlerExceptionResolver' (0) | 2023.01.17 |
JdbcSQLIntegrityConstraintViolationException - @GeneratedValue의 GenerationType (0) | 2023.01.06 |