본문 바로가기

Spring/JPA

Spring JPA - 속성 표현식

 

속성 식은 관리되는 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