속성 식은 관리되는 Entity의 직접 속성만 참조할 수 있다.
쿼리 생성 시, 구문 분석된 속성은 관리되는 도메인 클래스의 속성이다.
그러나 중첩된 속성을 조회하여 제약 조건을 정의할 수 있다.
List<Person> findByAddressZipCode(ZipCode zipCode);
Person에게 우편번호와 함께 주소가 있다고 가정한다.
이 경우 메서드는 x.address.zipCode 속성 순회를 만든다.
해결 알고리즘은 전체 부분(AddressZipCode)을 속성으로 해석하여 시작하고, 도메인 클래스에서 그 이름(대문자 없음)의 속성을 체크한다.
만약 알고리즘이 성공하면 그 속성을 사용한다.
그렇지 않으면 그 알고리즘은 카멜 케이스의 출처(원래 코드)를 오른쪽부터 머리와 꼬리를 분할하고 일치하는 속성을 찾으려고 시도한다.
-> 출처(원래 코드) AddressZipCode에서 오른쪽 부터 시작해서 분할하면 AddressZip과 Code로 분할 됨
알고리즘이 해당 머리를 가진 속성을 찾으면 꼬리를 가져와서 거기에서 계속해서 트리를 구축하고 방금 설명한 방식으로 꼬리를 분할한다.
첫 번째 분할이 일치하지 않으면, 알고리즘은 분할 지점을 왼쪽(Address, ZipCode)으로 이동하여 계속한다.
이것은 대부분의 경우 작동하지만, 알고리즘이 잘못된 속성을 선택할 수 있다.
Person클래스에 addressZip속성이 있다고 가정한다.
알고리즘은 첫 번째 분할 라운드에서 이미 일치하고 잘못된 속성을 선택하고 실패한다.(addressZip타입은 코드 속성이 없을 수 있으므로)
이 모호성을 해결하기 위해 메서드 이름 안에 _를 사용하여 수동으로 순회 지점을 정의할 수 있다.
따라서 메서드이름은 다음과 같다.
List<Person> findByAddress_ZipCode(ZipCode zipCode);
밑줄 문자를 예약된 문자로 취급하기 때문에, 표준 Java 명명 규칙을 따르는 것이 좋다.
(속성 이름에 밑줄을 사용하지 않고 카멜케이스 사용)
'Spring > JPA' 카테고리의 다른 글
Spring JPA - 쿼리 결과 제한 (0) | 2022.10.14 |
---|---|
Spring JPA - 특수 매개변수 처리 (0) | 2022.10.14 |
Spring JPA - 쿼리 생성 (0) | 2022.10.14 |
Spring JPA - 쿼리 조회 전략 (0) | 2022.10.14 |
Spring JPA - 쿼리 메서드 정의 (0) | 2022.10.14 |