Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 클린코드
- 읽기쉬운코드
- 코딩테스트
- Java
- 백준
- 그리디
- 코딩
- 엘라스틱서치
- 코드
- 애자일기법
- 애자일
- Spring
- database
- 스프링
- 그리디알고리즘
- 알고리즘
- 개발
- 데이터베이스
- 애자일프로그래밍
- 프레임워크
- 개발자
- API
- Elasticsearch
- framework
- JPA
- ES
- Baekjoon
- spring boot
- 자바
- cleancode
Archives
- Today
- Total
튼튼발자 개발 성장기🏋️
#16 : query method를 정의하자 본문
반응형
repository 프록시는 메소드 명으로부터 query를 가지고 오는 방법이 두 가지가 있다.
- 메소드 명으로부터 query를 직접 가지고 오는 방법.
- 수동적으로 정의된 query를 가지고 오는 방법.
이 두 가지 방법의 선택은 스토어에 따라 달라질 수 있다. 실제 어떤 query가 만들어 지는지는 어떠한 전략(?)이 있다.
- CREATE
- query 메소드의 이름을 가지고 query를 만든다.
- well-known prefix를 모두 제거하고 나머지 이름 부분 가지고 파싱해서 query를 만든다. (ex. findById())
- USE_DECLARED_QUERY
- 선언 되어있는 query를 찾는다.
- 찾지 못하면 예외가 있으니 예외처리를 해주어야한다.
- 어노테이션을 사용하여서 어딘가에 정의되어 있을 수 있다.
- CREATE_IF_NOT_FOUND
- 기본 값
- 정의된 query를 먼저 찾고 없으면 메소드 명을 가지고 query를 만든다.
제거되는 prefix는 다음과 같다.
- find…By
- read…By
- query…By
- count…By
- get…By
그래서 이런식으로 메소드명을 정의하면 된다.
interface PersonRepository extends Repository<Person, Long> {
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
// Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
// Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);
// Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
// Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}
잘 보면 distinct도 함께있고 orderby 등 sql문을 유추할 수도 있다. 메소드를 파싱한 실제 결과는 persistence store에 따라 다르지만 다음과 같이 주의사항이 있다.
- 조건절을 'AND' 또는 'OR'를 가지고 연결 할 수 있다.
- Between, LessThan, GreaterThan, Like도 지원한다.
- 지원되는 연산자는 datastore마다 다르니 해당 문서를 참고해야한다.
- 개별 특성(ex. findByLastnaeIgnoreCase)과 대소문자 구분을 무시해주는 특성(ex. findByLastnameAndFirstnameAllIgnoreCase) ignoreCase flag의 설정을 지원한다.
반응형
'Framework > spring' 카테고리의 다른 글
#18 : Lombok (0) | 2020.07.22 |
---|---|
#17 : H2 database 연동 준비 (0) | 2020.06.13 |
#15 : 상속 없이 repository를 만들자 (0) | 2020.05.24 |
#14 : JPA 시작 (0) | 2020.05.18 |
#13 : JDBC (Java DataBase Connectivity) (0) | 2020.05.10 |