JPA에서 사용할 수 있는 쿼리 의미, SQL 문법과 비슷
SQL에서는 테이블이나 칼럼의 이름을 사용한는 것과 달리 JPQL은 엔티티 객체를 대상으로 수행하는 쿼리이기에 매핑된 엔티티의 이름과 필드 이름 사용
SELECT p FROM Product p WHERE p.number = ?1;
FROM 뒤에 엔티티 타입, WHERE 뒤에 엔티티 속성
리포지토리는 JpaRepository를 상속받는 것만으로도 다양한 CRUD 메서드를 제공
-> 이러한 기본 메서드들은 식별자 기반으로 생성
되기 때문에 결국 별도의 메서드를 정의해서 사용
쿼리 메서드는 크게 동작을 결정하는 주제(Subject)
와 서술어(Predicate)
로 구분
find~by, exists~by와 같은 키워드로 쿼리와 주제를 정하며, By
는 서술어의 시작
을 나타내는 구분자 역할을 함
서술어 부분
은 검색 및 정렬 조건을 지정하는 영역
-> 엔티티 속성으로 정의 하거나 AND,OR을 통해 조건을 확장하는 것도 가능
// 리턴타입 + (주제+서술어(속성)) 구조의 메서드
List<Person> findByLastnameAndEmail(String lastName, String email)
조회의 기능
을 수행 하는 키워드
~
영역에는 도메인(엔티티)를 표현할 수 있는데 보통 리포지토리에서 이미 도메인을 설정한 후 메서드를 사용하기에 중복으로 판단해 생략 하기도
리턴 타입으로는 Collection
이나 Stream
에 속한 하위 타입으로 설정 가능
find~By
// find..By
Optional<Product> findByNumber(Long number);
List<Product> findAllByName(String name);
Product queryByNumber(Long number);
exist~By
: 특정 데이터가 존재하는지 확인하는 키워드(리턴 타입:boolean)
//exists..By
Boolean existsByNumber(Long number);
count~By
: 조회 쿼리를 수행한 후 쿼리 결과로 나온 레코드 수 리턴
//count..By
int countByName(String name);
delete~By
, remove~By
: 삭제 쿼리를 수행(리턴 타입이 없거나 삭제 횟수 리턴)
// delete..By, remove..By
void deleteByNumber(Long number);
long removeByName(String name);
~First< number >~
, ~Top< number> ~
쿼리를 통해 조회된 결괏값의 개수를 제한하는 키워드
두 키워드는 동일한 동작으로 수행하며, 주제와 By 사이에 위치
한번의 동작으로 여러 건을 조회할때 사용되며, 단 건으로 조회하기 위해서는 < number >를 생략
// ..First<number>.., ..Top<number>..
List<Product> findFirstByName(String name);
List<Product> findTop10ByName(String name);
is
: 값의 일치를 조건으로 사용하는 조건자 키워드, 생략 하는 경우가 많으며 Equals
와 동일한 기능 수행
// FindByNumber 메서드와 동일하게 작동
Product findByNumberIs(Long number);
Product findByNumberEquals(Long number);
(is)Not
: 값의 불일치를 조건으로 사용하는 조건자 키워드
Product findByNumberIsNot(Long number);
Product findByNumberNot(Long number);
(is)True
,(is)False
: boolean 타입으로 지정된 칼럼값을 확인하는 키워드
Product findByisActiveTrue();
Product findByisActiveisTrue();
Product findByisActiveFalse();
Product findByisActiveIsFalse();
(is)Null
, (is)NotNull
: 값이 null인지 검사하는 조건자 키워드
List<Product> findByUpdatedAtNull();
List<Product> findByUpdatedAtIsNull();
List<Product> findByUpdatedAtNotNull();
List<Product> findByUpdatedAtIsNotNull();
And
, Or
: 여러 조건을 묶을 때 사용
Product findByNumberAndName(Long number, String name);
Product findByNumberOrName(Long number, String name);
(is)GreaterThan
,(is)LessThan
, (is)Between
숫자나 datetime 칼럼을 대상으로 한 비교 연산에 사용할 수 있는 조건자 키워드
경계값을 포함하려면 Equal
키워드 추가
List<Product> findByPriceIsGreaterThan(Long price);
List<Product> findByPriceGreaterThan(Long price);
List<Product> findByPriceGreaterThanEqual(Long price);
List<Product> findByPriceIsLessThan(Long price);
List<Product> findByPriceLessThan(Long price);
List<Product> findByPriceIsBetween(Long lowPrice, Long highPrice);
List<Product> findByPriceBetween(Long lowPrice, Long highPrice);
(is)StartingWith(=StartsWith)
, (is)EndingWith(=EndsWith)
, (is)Containing(=Contains)
, (is)Like
칼럼값에서 일부 일치 여부를 확인하는 조건자 키워드(SQL의 %과 동일)
Containing은 문자열 양 끝, Start와 End는 각각 문자열 앞뒤에 %가 배치됨
List<Product> findByNameLike(String name);
List<Product> findByNameIsLike(String name);
List<Product> findByNameContains(String name);
List<Product> findByNameContaining(String name);
List<Product> findByNameIsContaining(String name);
List<Product> findByNameStartsWith(String name);
List<Product> findByNameStartingWith(String name);
List<Product> findByNameIsStartingWith(String name);
List<Product> findByNameEndsWith(String name);
List<Product> findByNameEndingWith(String name);
List<Product> findByNameIsEndingWith(String name);