TroubleShooting
[JPA] 쿼리 생성하는 메서드명의 keyword를 체크하자.
뭉지(moonz)
2022. 6. 27. 20:01
반응형
에러
발생한 에러
는 다음과 같습니다.
Caused by: java.lang.IllegalStateException: Operator SIMPLE_PROPERTY on imageId requires a scalar argument, found class {클래스명} in method {메서드명}({메서드의 인자 path}).
failed to creqte query ~~ 라고 하며 위와 같이 문제되는 메서드를 친절히 알려주는데, 해당 메서드가 쿼리를 만들어내지 못한다는 의미로 해석할 수 있습니다.
바로 아래 deleteAllByImageId() 메서드가 문제입니다.
@Repository
public interface ImageRepository extends JpaRepository<Image, Long> {
// 생략
void deleteAllByImageId(Iterable<? extends Long> imageIds);
}
원인
JPA는 정해놓은 규약에 따라 메서드로 선언해놓으면 이에 맞는 쿼리를 자동으로 생성해주는데, 그 규약에 지켜지지 않거나 인자를 매칭할 수 없으면 쿼리를 생성할 수 없게 됩니다.
위에서 제가 원했던 쿼리는 여러 imageId를 전달해서 이에 해당하는 데이터들을 제거하는 것이었습니다.
(실제 서비스를 진행할 때에도 데이터를 제거하는 방향이 맞는지 모르겠네요 제거하기보다 제거필드를 따로 만들어둘지??)
그럼 이제 지원되는 메서드명 keyword를 찾아봅시다.
In 키워드를 이용해서 인자로 전달되는 칼럼값에 해당하는 데이터들을 쿼리하도록 지원하네요!
해결
@Repository
public interface ImageRepository extends JpaRepository<Image, Long> {
// 생략
void deleteAllByImageIdIn(Iterable<? extends Long> imageIds);
}
해당 문서글에 JPA 메서드명에 대한 규약을 참고하고 작성합시다!
반응형