경희대학교 컴퓨터공학부 하계 리턴 백엔드(스프링부트) 스터디 4주차 - 트랙장 최현영
JPQL(JPA Query Language)
select m from member m
⇒ 여기서 member는 엔티티 타입이고, m이라는 별칭으로 지정해 주었고, 해당 엔티티의 모든 필드를 출력하도록 JPQL을 작성하였다.
쿼리 메서드 살펴보기
JpaRepository 인터페이스는 상속만 해줘도 이미 정의되고 구현된 CRUD 메서드를 호출하여 사용할 수 있었다.
이렇듯, 개발자의 입맛대로 쿼리문을 정의할 수 있도록 키워드 몇개를 조합하여 하나의 메서드를 생성할 수 있는데 이를 쿼리 메서드라고 부른다.
쿼리 메서드 작성은 Jpa리파지토리 인터페이스를 상속받은, 사용자 정의 인터페이스의 블록 내부에서 작성한다.
크게 동작을 결정하는 주제와 서술어로 구분한다.
리턴타입 { 주제 + 서술어}(대상 필드)
List<Member> findByClub(String club)
자세한 쿼리는 다음 기술 블로그를 참고
주제 키워드
find(All)By…
//findBy...
Optional<Member> findByName(Stirng name);
Member findByClub(String club);
List<Member> findAllByGeneration(String generation);
b. existBy…
//existsBy...
boolean existsByName(String name);
c. countBy…
Long countByGeneration(String generation);
d. deleteBy
삭제해줘
삭제를 수행하는 쿼리
void deleteById(Long Id); //반환값 없음
e. …First<Number>… / …Top<Number> …
몇 개만 추려줘
쿼리를 통해 조회딘 결과값의 갯수를 제한함
Number는 몇개까지 조회할 것인지를 표현하는 것으로 오직 단일의 엔티티 인스턴스만 조회하고자 한다면 생략 가능
List<Member> findFirst3ByGeneration(String generation);
//처음 상위 3건만 조회하고자 함
List<Member> findTop5ByGeneration(String generation);
//상위 5건만 조회하고자 함
f. Distinct
중복 제거
List<Member> findDistinctByXXX();
조건자 키워드
//FindBy..와 동일하게 적용됨
Member findByClubIs(String club);
Member findByClubEquals(String club);
b. IsNot
Member findByClubIsNot(String club);
c. IsNull / IsNotNull
List<Member> findAllByClubIsNull(String club, String generation);
List<Member> findAllByClubIsNotNull(String club);
d. IsTrue / isFalse
e. And / Or
f. IsGreaterThan(Equal)[after] / IsLessThan(Equal)[before] / IsBetween
g. IsStartingWith / IsEndingWith / IsContaining
Order By
List<Member> findByClubOrderByGenerationAsc(String club);
List<Member> findByClubOrderByGenerationDesc(String club);
d. 여러 정렬 조건을 주고 싶다면 And와 Or 키워드는 사용하지 않음
List<Member> findByClubOrderByGenerationAscStudentIdAsc(String club);
List<Member> findByClubOrderByGenerationDescStudentIdDesc(String club)
e. Sort 객체 및 Order 객체 활용 ⇒ 매개변수 쿼리 정렬
//리파지토리 인터페이스 내
List<Member> findByClub(String club, Sort sort);
//서비스 클래스 내
List<Member> members = memberRepository.findByName("RETURN",
Sort.by(Order.asc("generation"));
//두개 이상의 정렬 조건인 경우 Sort.by(Order.by(~) , ...);
Page 및 Pageable
//리파지토리 인터페이스 내
Page<Member> findByClub(String club, Pageable pageable);
//반환값은 Page 타입로 두고, 입력 파라미터로 Pageable 타입으로 두자,
//서비스 클래스 내
Page<Member> memberPage = memberRepository.findByClub("RETURN",
PageReqeust.of(2,6));
@Query
@Query("SELECT m FROM MEMBER AS m WHERE m.club = :club")
List<Member> findByClub(@Param("club") String club);
⇒ AS 문을 통해 Member 엔티티를 m이라는 별칭을 두었다.
⇒ @Query 어노테이션의 JPQL 중, 조건문에서 ‘:’ 은 이름 기반으로 입력 파라미터의 값을 가져오기 위한 파리미터 바인딩을 해주는 문법에 해당한다. 즉, club이라는 입력 파라미터에 “RETURN”이라는 문자열이 들어오면 @Param에 정의한 club에 바인딩하라고 지시하고, ‘:club’에 “RETURN”을 대입하는 것이다.
연관관계
8.1 applicatoin.yml에서 opne-in-view 옵션을 false로 설정하자[매우 중요]
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
show_sql: true
format_sql: true
**open-in-view: false**