[JPA] FindAllBy{}와 FindAllBy{}In

코코코딩을 합시다·2024년 3월 30일

Myrok에서 tagName(String)으로 구성된 리스트로 모든 tag List를 반환하는 메소드를 구현하던 중 발생한 오류이다.

문제 코드

@Repository
public interface TagRepository extends JpaRepository<Tag, Long> {
    Optional<Tag> findByTagName(String tagName);
    List<Tag> findAllByTagName(List<String> tagList); // 문제 코드

}

오류

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'recordServiceImpl' defined in file [RecordServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 2: Error creating bean with name 'tagRepository' defined in com.example.myrok.repository.TagRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract java.util.List com.example.myrok.repository.TagRepository.findAllByTagName(java.util.List); Reason: Failed to create query for method public abstract java.util.List com.example.myrok.repository.TagRepository.findAllByTagName(java.util.List); Operator SIMPLE_PROPERTY on tagName requires a scalar argument, found interface java.util.List in method public abstract java.util.List com.example.myrok.repository.TagRepository.findAllByTagName(java.util.List)

원인

메소드 시그니처에서 List 타입의 매개변수를 받도록 되어 있으나, Spring Data JPA에서는 이를 스칼라(단일 값) 타입으로 기대했기 때문에 쿼리 생성에 실패했다.
Spring Data JPA의 메소드 명명 규칙에 따르면,
여러 값을 대상으로 하는 조회는 In 키워드를 사용해야 한다.

즉, List를 파라미터로 받아 조회를 하는 경우 In 키워드를 사용해야 한다는 것.

수정 코드

@Repository
public interface TagRepository extends JpaRepository<Tag, Long> {
    Optional<Tag> findByTagName(String tagName);
    List<Tag> findAllByTagNameIn(List<String> tagList); // 수정 코드

}

오류 해결 !

profile
좋아하는 걸로 밥 벌어먹기

0개의 댓글