Spring Data Jpa Query Method에 대해 알아보자

쿼리 메소드 기능


메소드 이름으로 쿼리 생성

: 메소드 이름을 분석해서 JPQL 쿼리 실행을 시켜줘!!


스프링 데이터 jpa가 제공하는 쿼리 메소드 기능

(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#reference)

  1. 조회 : find…By, read…By, query…By, get…By (…에는 어떠한 것도 들어갈 수 있다 ex) findHelloBy)
  2. COUNT: count…By (반환타입 : long)
  3. EXISTS : exists…By (반환타입 : boolean)
  4. 삭제 : delete…By, remove…By (반환타입 : long)
  5. DISTINCT : findDistinct, findMemberDistinctBy
  6. LIMIT : findFirst3, findFrist, findTop, findTop3 이런식으로



JPA NamedQuery

: JPA의 NamedQuery를 호출할 수 있어.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Entity
@NamedQuery(
name="Member.findByUsername",
query="select m from Member m where m.username = :username")
public class Member {
...
}

//위 처럼 엔티티에 NamedQuery를 정의한 후

@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);

//이렇게 사용할 수 있어.
//참고로 @Query(name = ~~) 를 생략할 수도 있어!
  1. Spring Data Jpa는 선언한 “도메인 클래스 + . + 메서드 이름”으로 Named 쿼리를 찾아서 수행해줘
  2. 없으면 메서드 이름으로 쿼리 생성 전략을 사용해.



@Query, 레파지토리 메소드에 쿼리 정의

1
2
3
4
5
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select m from Member m where m.username= :username and m.age = :age")
List<Member> findUser(@Param("username") String username, @Param("age") int
age);
}
  1. @org.springframework.data.jpa.repository.Query 어노테이션을 사용해
  2. 실행할 메서드에 정적 쿼리를 직접 작성하기에 이름없는 Named 쿼리라고 할 수 있지
  3. JPA Named 쿼리가 주는 가장 큰 이점인 어플리케이션 실행 시점에 문법 오류를 발견할 수 있어!! goood!

@Query, 값, DTO 조회하기

  1. 단순히 값 하나 조회
1
2
@Query("select m.username from Member m")
List<String> findUsernameList();

이런식으로 사용할 수 있어.

JPA 값 타입(Embedded)도 이렇게 조회 가능해

  1. DTO로 직접 조회
1
2
3
@Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) " +
"from Member m join m.team t")
List<MemberDto> findMemberDto();

이렇게 DTO로 직접 조회하기 위해서는 JPA의 new 명령어를 쓰면 돼. 이때 패키지 위치를 기재하여야하며 해당 생성자를 가진 DTO가 필요해!!



파라미터 바인딩

두가지 방법이 있어

  1. 위치 기반
  2. 이름 기반
1
2
3
4
5
6
7
select m from Member m where m.username = ?0 //위치 기반
select m from Member m where m.username = :name //이름 기반

//파라미터를 넘기는 건
@Query("select m from Member m where m.username = :name")
Member findMembers(@Param("name") String username);
//이런식으로 하면 돼

가독성과 유지보스를 위해 이름기반 파라미터 바인딩을 쓰자!!

참고로 Collection 타입을 파라미터로 넘겨서 in 절을 이용할 수 있어!!

1
2
3
@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") List<String> names);
//이렇게 말이야!



반환 타입

유연한 반환타입을 지원해!!

컬랙션, 단건, Optional 원하는 대로 사용 가능해

(단건일 때 만약 조회 결과가 없으면 null을 반환하게 끔 spring data jpa 에서 처리를 해줬어. 원래는 javax.persistence.NoResultException 예외 발생해)







https://www.inflearn.com/course/스프링-데이터-JPA-실전