
NameQuery@Query - 리포지토리 메소드에 쿼리 정의@EntityGraph@Query 어노테이션을 사용해서 리파지토리 인터페이스에 쿼리 직접 정의장점: 조건이 2개 이하인 쿼리일 때 매우 편리
단점: 조건이 많아지면 메소드의 이름이 지나치게 길어지는 단점
메소드 이름을 분석해서 JPQL 쿼리 실행


find...By,read...By,query...By,get...Bycount...By 반환 타입 longexists...By 반환 타입 booleandeleted...By,remove...By 반환 타입 longfindDistinct, findMemberDistinctByfindFirst3,findFirst,findTop3,findTop3참고: 이 기능은 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다. 그렇지 않으면 어플 시작 시점에 오류가 발생한다.
이렇게 로딩 시점에 오류를 인지할 수 있는 것이 스프링 데이터 JPA의 매우 큰 장점이다.
스프링 데이터 JPA를 사용하면 실무에서 Named Query를 직접 등록해서 사용할 일은 드물다.
대신 @query를 사용해서 리포지토리 메소드에 쿼리를 직접 정의한다.
(3. @Query, 리포지토리 메소드에 쿼리 정의하기 참고)
@NamedQuery 어노테이션으로 Named 쿼리 정의 (Member 엔티티)
@Entity
@NamedQuery( name="Member.findByUsername",
query="select m from Member m where m.username = :username")
public class Member {
...
}
스프링 데이터 JPA로 NamedQuery 사용 (Member 리포지토리)
public interface MemberRepository
extends JpaRepository<Member, Long> { //** 여기 선언한 Member 도메인 클래스
// @Query(name = "Member.findByUsername") 생략 가능
List<Member> findByUsername(@Param("username") String username);
}
@Query(name = "Member.findByUsername") 생략 가능조건이 여러개 일 때 짧은 메서드 이름으로 작성 가능한 장점
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);
}
@org.springframework.data.jpa.repository.Query 어노테이션 사용참고: 실무에서는 메소드 이름으로 쿼리 생성 기능은 파라미터가 증가하면 메서드 이름이 매우 지저분해짐, 따라서
@Query기능을 자주 사용
단순히 값 하나를 조회
@Query("select m.username from Member m")
List<String> findUsernameList();
JPA 값 타입(@Embedded)도 이 방식으로 조회 가능
DTO 직접 조회
@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 생성자가 필요
MemberDto 클래스
package study.datajpa.repository;
import lombok.Data;
@Data
public class MemberDto {
private Long id;
private String username;
private String teamName;
public MemberDto(Long id, String username, String teamName) {
this.id = id;
this.username = username;
this.teamName = teamName;
}
}
"본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다."