[DataJpa] 쿼리 메서드 기능

스프링 데이터 JPA 쿼리 메서드

  • 메서드 이름으로 쿼리 생성
    • 메서드 이름을 분석하여 JPQL 쿼리로 자동 생성
  • 종류
    1. 메서드 이름
    1. 메서드 이름으로 JPA Named Query 호출
    1. @Query 어노테이션을 사용
      1. 레포 인터페이스에 쿼리를 직접 정의함

메서드 이름으로

public interface ItemRepository extends JpaRepository<Item, Long> {
    List<Item> findByName(String name);
}
@Test
    void selectSpringDataJpa() {
        List<Item> item = itemRepository.findByName("item1");
        System.out.println("item = " + item);
    }
select i1_0.id,i1_0.name,i1_0.price,i1_0.stock_quantity from item i1_0 where i1_0.name='item1';
item = [Item(id=2, name=item1, price=1000, stockQuantity=1)]

메서드 이름으로 만들때 주의

  • 규칙 준수
    • 메서드 이름을 정해진 규칙을 반드시 지켜야함
    • (예: findBy, GreaterThan, Between 등).
  • 필드명 변경시 주의!
    • 엔티티의 필드명이 변경되면, 관련 메서드의 이름도 함께 변경해야함
    • 어플리케이션 컨텍스트가 초기화되는 시점에
      • → Data jpa 레포 인터페이스 로드
      • → 메서드 이름을 분석해 쿼리 생성
      • 메서드 이름이 엔티티의 필드명과 일치하지 않거나 잘못된 규칙으로 작성되는 경우
      • 스프링 데이터 JPA 는 해당 쿼리 메서드에 대한 구현을 생성 X → 오류 발생
  • 문법
    1. And / Or
      • findByLastnameAndFirstname: where x.lastname = ?1 and x.firstname = ?2
      • findByLastnameOrFirstname: where x.lastname = ?1 or x.firstname = ?2
    1. Is, Equals
      • findByFirstname, findByFirstnameIs, findByFirstnameEquals: where x.firstname = ?1
    1. Between, LessThan, GreaterThan 등
      • findByStartDateBetween: where x.startDate between ?1 and ?2
      • findByAgeLessThan: where x.age < ?1
      • findByAgeGreaterThan: where x.age > ?1
    1. Null 관련
      • findByAgeIsNull: where x.age is null
      • findByAgeIsNotNull, findByAgeNotNull: where x.age is not null
    1. Like, NotLike
      • findByFirstnameLike: where x.firstname like ?1
      • findByFirstnameNotLike: where x.firstname not like ?1
    1. StartingWith, EndingWith, Containing
      • findByFirstnameStartingWith: where x.firstname like ?1 (parameter에 %가 앞에 붙음)
      • findByFirstnameEndingWith: where x.firstname like ?1 (parameter에 %가 뒤에 붙음)
      • findByFirstnameContaining: where x.firstname like ?1 (parameter 양쪽에 %가 감싸짐)
    1. OrderBy, Not, In
      • findByAgeOrderByLastnameDesc: where x.age = ?1 order by x.lastname desc
      • findByLastnameNot: where x.lastname <> ?1
      • findByAgeIn(Collection ages): where x.age in ?1
      • findByAgeNotIn(Collection ages): where x.age not in ?1
    1. 기타 키워드
      • TRUE, FALSE: findByActiveTrue(), findByActiveFalse()
      • IgnoreCase: findByFirstnameIgnoreCase: where UPPER(x.firstname) = UPPER(?1)

Uploaded by N2T

'자바 > QueryDsl' 카테고리의 다른 글

[QueryDSL] 프로젝션과 결과의 반환  (0) 2023.11.15
[DataJpa] 데이터 JPA 공통 인터페이스  (0) 2023.11.15
[DataJpa] Named Query  (0) 2023.11.15
[DataJpa] Named Query  (0) 2023.11.15
[QueryDSL] 그룹과 조인  (0) 2023.11.15