JPQL(JPA Query Language)

WOOK JONG KIM·2022년 10월 31일
0
post-thumbnail

JPQL

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)

쿼리 메서드의 주제 키워드

  • find~By
  • read~By
  • get~By
  • query~By
  • search~By
  • stream~By

조회의 기능을 수행 하는 키워드

~영역에는 도메인(엔티티)를 표현할 수 있는데 보통 리포지토리에서 이미 도메인을 설정한 후 메서드를 사용하기에 중복으로 판단해 생략 하기도

리턴 타입으로는 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);
profile
Journey for Backend Developer

0개의 댓글