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