Spring/Spring Data JPA

[Spring Data JPA] 3-1. Defining Query Methods (1)

noahkim_ 2024. 8. 2. 10:58

1. Query Lookup Strategies

@EnableJpaRepositories (queryLookupStrategy)

queryLookupStrategy 옵션
설명
CREATE_IF_NOT_FOUND (기본값)
선언된 쿼리(@Query 등)이 있으면 사용하고, 없으면 메서드 이름 기반으로 쿼리 생성
CREATE
무조건 메서드 이름 기반으로 쿼리 생성 (어노테이션 선언 무시)
USE_DECLARED_QUERY
선언된 쿼리(@Query 등)만 사용, 없으면 애플리케이션 시작 시 예외 발생

 

2. Query Creation

Query Builder 기반 생성

  • 메서드 이름을 추론하여 JPQL Query를 생성합니다.

 

Parsing Query Method Name

요소 설명 예시
subject 쿼리 목적 (메서드 도입부)
find, read, query, count, delete, exists
limit 결과 제한
findTop3By, findFirstBy, findDistinctBy
predicate 조건 정의 (By 이후)
findByUsernameAndAge, findByStatusOrRole
연산자 조건 연산자 사용
Between, LessThan, GreaterThan, Like 등
order 정렬 지정
OrderByAgeAsc, OrderByCreatedDateDesc
대소문자 무시 대소문자 무시 검색
findByNameIgnoreCase, findByEmailAllIgnoreCase

 

예제

더보기
interface PersonRepository extends Repository<Person, Long> {

  // 여러 조건을 사용한 쿼리
  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // distinct 플래그를 활성화한 쿼리
  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  // 개별 속성에 대해 대소문자 무시를 활성화한 쿼리
  List<Person> findByLastnameIgnoreCase(String lastname);
  // 모든 적합한 속성에 대해 대소문자 무시를 활성화한 쿼리
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  // 정적 ORDER BY를 활성화한 쿼리
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

 

Property Expressions

  • 메서드 이름에서 엔티티 속성을 접근이 가능함
구분 설명
기본 속성 접근 엔티티의 직접 속성을 기준으로 탐색
중첩 속성 접근 엔티티 내부에 포함된 객체의 속성까지 탐색
전체 속성 해석 메서드 이름 전체를 하나의 속성으로 해석 시도
부분 속성 해석 오른쪽부터 camelCase로 나누어 부분 속성 해석 (재귀적)

 

예제

더보기
@Entity
public class Person {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @Embedded
    private Address address;

    // Getter, Setter
}

@Embeddable
public class Address {

    private String city;
    private String street;
    private String zipCode;

    // Getter, Setter
}
// 기본 속성 접근
findByUsername(String username) 

// 중첩 속성 접근
findByAddressZipCode(ZipCode zipCode) 

// 전체 속성 해석
findByAddressZipCode → addressZipCode 라는 단일 속성으로 시도

// 부분 속성 해석
findByAddressZipCode → address.zipCode 로 나눠서 탐색

 

 

 

 

출처