JPA Query Language
JPA에서 사용할 수 있는 쿼리를 의미한다.
JPQL은 테이블이나 칼럼이름 대신 엔티티 객체를 대상으로 수행하는 쿼리다. 따라서 매핑된 엔티티의 이름과 필드의 이름을 사용한다.
SELECT p FROM Product p WHERE p.number = ?1;
JPQL은 별도의 메소드를 정의해서 사용한느 경우가 많으며 간단한 쿼리문을 작성하기 위해 사용되는 것이 쿼리 메소드
이다.
동작을 결정하는 주제와 조건을 지정하는 서술어로 구분
주체By서술어 방식으로 사용된다.
ex) List<Person> findByLastnameAndEmail(String lastName, StringEmail
(리턴타입) + {주제 + 서술어(속성)} 구조
...에 해당하는 도메인(엔티티)를 표현할 수 있다.
Repository에선 이미 도메인을 설정한 후 메서드를 사용하기 때문에 생략하기도 한다.
find...By
read...By
get...By
query...By
search...By
stream...By
조회기능 수행 메소드
Optional<Product> findAllByNumber(Long number);
Product queryByNumber(Long number)
특정 데이터 존재 확인 키워드 / boolean
조회 쿼리 수행 후 결과 레코드 개수를 리턴한다.
삭제 쿼리 수행 후 리턴 타입이 없거나 삭제한 횟수 리턴
...First<Number>... / ...Top<Number>...
조회된 결과값의 개수를 제한하는 키워드 number 생략 시 단 건 조회
List<Product> findFirst10ByName(String name)
JPQL 서술어 부분에서 사용할 수 있는 조건자 키워드
값 일치를 조건으로 사용하는 키워드(도메인을 받으므로 생략되는 경우가 많다)
값 불일치를 조건으로 사용하는 키워드
null 확인 조건자 키워드
boolean 타입으로 지정된 칼럼 값 확인
숫자, datetime 칼럼 대상 비교연산에 사용하며 경계값을 포함하려면 Equals 키워드 사용
List<Product> findByPriceGreaterThanEqual(Long price);
일부 일치 여부를 확인하는 조건자 키워드
오름차순 Asc 내림차순 Desc 키워드 사용
List<Product> findByNameOrderByNumberAsc(String name);
우선 순위 기준 설정 시 And Or 키워드 사용하지 않고 차례대로 작성
List<Product> findByNameOrderByNumberAscPriceDesc(String name);
Sort
, Order
객체를 활용해 쿼리문 작성
productRepository.findByName("펜",Sort.by(Order.asc("price"), Order.desc("stock")));
레코드를 개수를 나눠 페이지를 구분하는 것으로 JPA 에서는 Page와 Pageable 사용
Page<Product> findByName(Stirng name,Pageable pageable)
Page<Product> productPage = productRepository.findByName("펜",PageRequest.of(0,2));
Return 타입으로 Page
를 받아야하며 PageRequest 클래스를 사용한다.
Pageable
의 구현체로 of
메소드를 통해 PageRequest 객체를 생성한다.
of(int page, int size)
of(int page, int size, Sort)
of(int page, int size, Direction, String ..., properties)
page 페이지 번호(0부터 시작)
size 페이지당 데이터 개수
Sort 정렬
Direction 정렬 방향
... 속성
properties Sort.by(direction,properties)에 의해 정렬