본문 바로가기

Server Development/Data API

JPA - Query Method with Spring JPA

 

지금까지 Spring Data JPA의 JpaRepository의 기본 메서드(save() 등)를 사용하거나 JPA의 기본 메서드(persist() 등)을 사용해 DB에 CRUD를 했다. 항상 이렇게 사용하는데는 어디까지는 한계가 있다. 따라서 직접 필요한 경우에 한하여 쿼리문을 생성하는 방법에 대해서 알아보려고 한다.

 

 

JPQL

- Java Persistence Query Language

- 테이블이 아닌 엔터티를 대상으로 하는 객체지향 쿼리

- JPA는 JPQL을 베이스로 함.

- JPA가 작성하는 쿼리문을 JPQL이라고 생각하면 쉽고 이를 설정들을 통해서 각 DB에 맞는 쿼리로 변경해주는 형태임.

 

Query Method

- Spring Data JPA에서 제공

- 여전히 쿼리를 직접 짜는 것이 아닌 특정한 규칙을 통해 메서드를 만들면 쿼리를 생성해 줌.

- 만든 메서드는 JPARepository에 등록해 두어야 사용 가능

 

 

종류

( .. -> 엔터티를 표현가능하나 이미 JPARepository 생성시 정의되어 있어 생략 가능)

 

  • find..By
  • read..By
  • get..By
  • query..By

- 조회 기능

- Collection, Stramable, Entity로 return 가능

- 칼럼명은 단위당 대문자

 

- 예시 -

-> 해당 이름을 가진 회원들 찾기
List<MemberEntity> result = memberRepository.findByUserName(name);
List<MemberEntity> result = memberRepository.findMemberEntityByUserName(name);
List<MemberEntity> result = memberRepository.readByUserName(name);
List<MemberEntity> result = memberRepository.getByUserName(name);
List<MemberEntity> result = memberRepository.queryByUserName(name);

 

 

 

 

 

 

  • exists..By

- 특정 데이터가 있는지 확인 기능

- return boolean

 

- 예시 -

-> 해당 이름을 가진 회원의 존재여부 찾기
boolean result = memberRepository.existsByUserName(name);
boolean result = memberRepository.existsMemberEntityByUserName(name);

 

 

 

 

 

  • count..by

- 조회 후 결과의 수를 반환

- long 타입 반환

 

- 예시 -

-> 해당 이름을 가진 멤버 수
long  result = memberRepository.countByMemberName(name);

 

 

 

 

 

 

  • delete..by, remove..by

- 삭제 기능

- 리턴 타입이 없거나 삭제한 엔터티의 수를 반환

 

-예시-

-> 해당 이름을 가진 회원 삭제
deleteByUserName(name);
long result = memberRepository.deleteByUserName(name);

 

 

 

 

 

  • ..First<number>, ..Top<number>

- 조회되는 결과값의 수를 Number 부분에 삽입하면서 조정

- 한건 조회시 number 생략

- 기본적으로 정렬은 ID순으로 오름차순으로 정렬되어 있음.

 

- 예시 -

-> 해당 이름을 갖는 엔터티 숫자 정해서 조회
List<MemberEntity> = memberRepository.findFirst3ByUserName(name);
MemberEntity result = memberRepository.findFirstByUserName(name);
List<MemberEntity> result = memberRepository.findTop3ByUserName(name);

 

 

 

 

 

  • Is

- 값의 위치를 위한 조건자 키워드

- Equals 키워드와 동일한 기능

 

-예시-

 -> 해당 아이디와 같은 아이디를 갖는 회원 조회
 MemberEntity result = memberRepository.findByIdIs(String id);
 MemberEntity result = memberRepository.findByIdEquals(String id);

 

 

 

 

  • Not

- 값의 불일치를 체크하는 키워드

- 앞에 Is가 생략된 구조

 

-예시-

-> 해당 아이디와 다른 아이디를 갖는 회원 조회
MemberEntity result = memberRepository.findByIdNot(String id);
MemberEntity result = memberRepository.findByIdIsNot(String id);

 

 

 

 

 

  • Null, Not Null

- 해당 컬럼의 레코드 값이 Null인지 체크하는 키워드

 

-예시-

-> Email이 비어있는 회원 조회
List<MemberEntity> result = memberRepository.findByEmailIsNull();
List<MemberEntity> result = memberRepository.findByEmailIsNotNull();

 

 

 

 

 

  • True, False

- boolean 타입으로 지정된 컬럼의 값을 확인하는 키워드

 

-예시-

-> 해당 이름을 갖는 회원이 존재하는지에 대한 결과가 참인지, 거짓인지
boolean result = memberRepository.existsByUserNameIsTrue(name);
boolean result = memberRepository.existsByUserNameIsFalse(name);

 

 

 

 

 

  • And, Or

- 여러 조건들을 묶을 때 사용

 

-예시-

-> 해당 Email, 전화번호를 갖는 회원 조회, 해당 전화번호 또는 이메일을 갖는 회원 조회
List<MemberEntity> result = memberRepository.findByNameAndNumber(name, number);
List<MemberEntity> result = memberRepository.findByNameOrNumber(name, number);

 

 

 

 

 

  • GraterThan, LessThan, Between

- 숫자나 DateTime 컬럼에서 사용할 수 있는 비교연산 키워드

- 경계값을 포함하기 위해서는 Equal 키워드를 추가해야 함.

 

-예시-

-> 해당 나이보다 높은 나이를 갖는 회원 조회
List<MemberEntity> result = findByAgeGreaterThan(age);

 

 

 

 

 

  • StartingWith, EndingWith, Containing, Like

- 컬럼의 값에서 값이 일치하는 부분을 확인하는 키워드

- 특정 부분이 포함되어 있는지 확인(부분 일치)

 

-예시-

List<MemberEntity> result = findByNameContaining(String name);
List<MemberEntity> result = findByNameLike(String name);

 

 

 

 

 

  • Sorting : OrderBy

- 정렬 메서드

- Asc : 오름차순

- Desc : 내림차순

 

-예시-

List<MemberEntity> result = memberRepository.findByNameOrderByNameAsc(name);
List<MemberEntity> result = memberRepository.findByNameOrderByNameAscIdDesc(name);


List<MemberEntity> result = memberRepository.findByName(name, Sort.by(Order.asc(name)));
선언 : List findByName(String name, Sort sort);

 

 

 

 

 

  • Paging

- 데이터 페이지 처리 관련

- 반환값으로는 Page, Slice, List가 가능하며

- 예를들어, 10개의 데이터가 있을 때, .of(0, 2) 지정시 첫번째 두개의 데이터를 반환한다.

- .of(4, 2) 지정시 9,10번째 데이터를 반환한다.

 

-예시-

Page<MemberEntity> result = findByName(name, PageRequest.of(0, 2));
선언 : Page<MemberEntity> findByName(String name, Pageable pageble);
-> 헤당이름을 갖는 데이터들을 첫번째 페이지의 2개의 데이터 반환

Page<MemberEntity> result = findByName(name, PageRequest.of(0, 2, Sort.by(Order.asc(name))));
선언 : Page<MemberEntity> findByName(String name, Pageable pageble, Sort sort);
-> 헤당이름을 갖는 데이터들을 이름 오름차순으로 정렬한 후 첫번째 페이지부터 페이지당 2개의 데이터씩 반환

Page<MemberEntity> result = findByName(name, PageRequest.of(0, 2, Sort.by(Order.asc(name), Order.desc(Id))));

 

 

 

 

'Server Development > Data API' 카테고리의 다른 글

Cache - Redis  (0) 2023.04.06
JPA - @Query with Spring JPA  (0) 2023.04.05
JPA - Auditing  (0) 2023.04.04
JPA - EntityManager, EntityMapping, Context  (0) 2023.04.04
JPA - Spring JPA  (0) 2023.03.29