참고
Query Methods
NOTE
JPA Repository에서 어떤 형태로 이름을 작성하면 어떻게 동작하는지 제대로 알아보기!
•
Query Method의 이름은 Subject Part와 Predicate Part로 구분된다.
•
1번째 By까지를 Subject Part, 이후를 Predicate Part로 칭한다.
Subject Part
NOTE
찾고자 하는 주제에 해당된다!
•
별도의 설정이 없다면 모든 컬럼을 조회하고, Limit나 Distinct의 설정이 가능하다!
findAll
NOTE
findAll()
Java
복사
•
DB에서 전체 값을 list로 불러올 때 사용한다.
find...By
NOTE
Optional<User> findById(Long id);
List<User> findAllById(List<Long> ids);
Java
복사
•
Entity를 조회할 때 사용되는 키워드이다.
•
read, get, query, search, stream등 을 사용할 수도 있으나 find를 가장 많이씀
exists...By
NOTE
boolean existsById(Long id);
Java
복사
•
조회 유무를 boolean 타입으로 반환한다.
counts...By
NOTE
long countByActive(boolean active);
Java
복사
•
검색 결과에 따른 총 record수를 반환한다.
...First<number>... , …Top<number>...
NOTE
Optional<User> findFirstByOrderByIdDesc();
Optional<User> findTopByOrderByNameAsc();
Java
복사
•
조회할 query결과 값 수를 제한하는 키워드인 First, Top이다.
•
단순하게 처음 쿼리를 조회하는 방식이면 위와같이 사용할 수 있다.
Page<User> findFirst5ByStatus(String status, Pageable pageable);
Slice<User> findTop10ByType(String type, Pageable pageable);
List<User> findFirst10BySex(String sex, Sort sort);
List<User> findTop3ByStatus(String status, Pageable pageable);
Java
복사
•
다만 조회하고자 하는 쿼리가 1개이상인 경우 Pageable 또는 Sort와 같은 인자를 설정해줘야 한다!
[ 참고]
•
Pageable과 Sort는 null을 허용하지 않기 때문에, 해당 인자에 null이 들어가면 에러가 발생한다!
•
만일 Sort나, Pageable을 사용하고 싶지 않을 경우에는 Sort.unsorted(), Pageable.uppaged()를 사용하면 된다!
Predicate Part
NOTE
By 이후 부분으로, 검색 및 정렬 조건을 작성한다!
•
검색 조건을 설정하는 Predicate keyword를 먼저 살펴본다!
[Is]
NOTE
Optional<User> findByEmail(String email);
Optional<User> findByEmailIs(String email);
Optional<User> findByEmailEquals(String email);
Java
복사
•
기본 일치 검색
•
키워드를 생략해도 동일하게 작동되며, 동일한 기능의 키워드로 Equals가 있다.
[Is]Not
NOTE
Optional<User> findByEmailNot(String email);
Optional<User> findByEmailIsNot(String email);
Java
복사
•
컬럼 단순 불일치 조건
[Is]Null, [Is]NotNull
NOTE
Optional<User> findByUpdatedAtNull();
Optional<User> findByUpdatedAtIsNull();
Java
복사
[Is]Null
•
컬럼값이 NULL인 레코드를 검색한다
[Is]NotNull
•
컬럼값이 NotNull인 레코드를 검색한다.
[Is]Empty, [Is]NotEmpty
NOTE
Optional<User> findByNameEmpty();
Java
복사
[Is]Empty
•
컬럼값이 Null이거나, 빈 문자열인 레코드를 검색한다.
[Is]NotEmpty
•
컬럼값이 Null이 아니거나, 빈 문자열이 아닌 레코드를 검색한다.
[Is]True, [Is]False
NOTE
List<User> findByActiveTrue();
List<User> findByActiveFalse();
Java
복사
[Is]True
•
boolean 타입 컬럼의 True를 검색한다.
[Is]False
•
boolean 타입 컬럼의 False를 검색한다.
And
NOTE
List<User> findByTypeAndActive(String type, String active);
Java
복사
•
조건을 and조건으로 엮고 싶을 때 사용한다.
Or
NOTE
List<User> findByTypeOrActive(String type, String active);
Java
복사
•
조건을 or조건으로 엮고 싶을 떄 사용한다.
[Is]GreaterThan, [Is]LessThan, [Is]Between
NOTE
List<User> findByAgeLessThan(int age);
List<User> findByAgeGreaterThanEqual(int age);
List<User> findByAgeGreaterThanEqualAndAgeLessThanEqual(int age1, int age2);
Java
복사
•
비교 연산을 지원하는 numeric, datetime 데이터타입의 컬럼에 설정할 수 있는 연산자다.
•
키워드 뒤에 Equal을 붙여 이상, 이하같은 조건을 설정할 수도 있다.