에러 내용
Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract org.springframework.data.domain.Page co m.bemate.domain.shelter.repository.PetRepository.findByShelterNo(com.bemate.domain.shelter.entity.Shelter,org.springframework.data.domain.Pageable); No property 'no' found for type 'Shelter'; Did you mean 'id'; Traversed path: Pet.shelter
코드
public interface PetRepository extends JpaRepository<Pet, String>, PetRepositoryCustom {
Page<Pet> findByShelterNo(Shelter shelter, Pageable pageable);
}
원인
나의 경우 Shelter 엔티티를 쿼리 파라미터로 전달했는데, JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값(ex.shelter_no)을 사용한다. 즉, 아래와 같이 SQL이 실행된다.
select
(생략)
from
pet p1_0
where
p1_0.shelter_no=? offset ? rows fetch first ? rows only
그래서 메서드 이름 또한 findByShelterNo로 명명했는데, 이게 문제가 되었다.
Spring Data JPA에서는 인터페이스에 findBy 접두어를 사용한 뒤, 검색 대상 필드의 이름을 CamelCase로 이어붙이면 메서드의 이름으로 적절한 JPQL 쿼리를 생성해준다.
Shelter 엔티티를 사용해서 조회하는데, 메서드 명은 findByShelterNo이니, No property 'no' found for type 'Shelter' 와 같은 오류가 발생한 것이다.
해결 방법
public interface PetRepository extends JpaRepository<Pet, String>, PetRepositoryCustom {
Page<Pet> findByShelter(Shelter shelter, Pageable pageable);
}
메서드 명을 findByShelterNo -> findByShelter로 바꾸어주니 바로 해결되었다.
🖍 앞으로 JpaRepository를 상속 받는 인터페이스를 사용할 때는 자동으로 쿼리가 만들어짐을 유의하여 메서드 이름을 정해야겠다.
'Troubleshooting' 카테고리의 다른 글
[Docker] executor failed running. exit code: 127 (0) | 2023.08.30 |
---|---|
[Spring Security] HandlerMappingIntrospector is required to use MvcRequestMatcher (0) | 2023.06.15 |