// 메서드에 JPQL 쿼리 작성
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
어노테이션 사용
실행할 메서드에 정적 쿼리를 직접 작성하므로 이름 없는 Named 쿼리라 할 수 있음
JPA Named 쿼리처럼 애플리케이션 실행 시점에 문법 오류를 발견할 수 있음
메서드 이름으로 쿼리 생성 기능은 파라미터가 증가하면, 메서드 이름이 매우 지저분
@Query
기능을 자주 사용// 단순히 값 하나를 조회
@Query("select m.username from Member m")
List<String> findUsernameList();
@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가 필요
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;
}
}
select m from Member m where m.username = ?0 // 위치 기반
select m from Member m where m.username = :name // 이름 기반
// 파라미터 바인딩
import org.springframework.data.repository.query.Param
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select m from Member m where m.username = :name")
Member findMembers(@Param("name") String username);
}
// 컬렉션 파라미터 바인딩
@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") List<String> names);
Collection
타입으로 in 절 지원List<Member> findByUsername(String name); // 컬렉션
Member findByUsername(String name); // 단건
Optional<Member> findByUsername(String name); // 단건 Optional
null
반환javax.persistence.NonUniqueResultException
예외 발생단건으로 지정한 메서드를 호출하면, 스프링 데이터 JPA는 내부에서 JPQL Query.getSingleResult()
메서드 호출
javax.persistence.NoResultException
예외 발생null
을