반응형
지난 포스팅에서 메소드 이름으로 쿼리를 생성해보았다.
메소드 이름만으로 모든 쿼리를 커버할 수 없다. 복잡하고 자세한 쿼리를 생성하려면 직접 JPQL을 작성해야 한다. 그러나 스프링데이터JPA는 개발자가 직접 리포지토리 구현체를 작성하지 않고 SpringDataJPA가 구현체를 프록시 객체로 생성하여 제공한다. 그러므로 개발자는 스프링데이터JPA가 적절한 구현체 로직을 생성할 수 있도록 원하는 JPQL 쿼리를 넘겨야 한다.
이를 위해, SpringDataJPA는 @Query 어노테이션을 제공한다.
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 usrename, @Param("age") int age);
}
@Query 어노테이션에 JPQL을 넣는다. 파라미터도 @Param 어노테이션으로 넣을 수 있다.
@Query의 가장 큰 장점은 컴파일 과정에서 JPQL의 오류를 발견한다는 점이다. @Query는 이름없는 @NamedQuery라고 할 수 있다. @NamedQuery,@Query는 프로그램이 로딩하는 시점에서 JPQL 파싱이 이루어진다. 메소드 호출 시점이 아닌 프로그램 로딩시점에서 JPQL 파싱이 이루어지기 때문에, JPQL 오류를 컴파일 시점에서 잡아낼 수 있다.
public interface MemberRepository extends JpaRepository<Member,Long> {
// 컬렉션 파라미터 바인딩 ( IN절 )
@Query("SELECT m FROM Member m WHERE m.username IN :names ")
List<Member> findByNames(@Param("names") Collection<String> names);
}
추가로 만약, JPQL에 IN절을 사용하여 쿼리를 생성하는 경우 Collection형식으로 파라미터를 받으면 된다.
이렇듯, @Query는 복잡한 정적쿼리를 사용할 경우 유용하게 사용할 수 있다. 만약 복잡한 동적쿼리를 사용해야 한다면 QueryDSL을 사용해야 한다. 이는 나중에 자세히 다루어 보겠다.
참고자료
반응형
'JPA > Spring Data JPA' 카테고리의 다른 글
[SpringDataJPA] @EntityGraph (0) | 2023.07.13 |
---|---|
[SpringDataJPA] 벌크성 수정쿼리 ( @Modifying ) (0) | 2023.07.13 |
[SpringDataJPA] 페이징 ( Pageable, Page, Slice ) (0) | 2023.07.12 |
[SpringDataJPA] 메소드 이름으로 쿼리생성하기 (0) | 2023.07.11 |
[SpringDataJPA] SpringDataJPA란? (0) | 2023.07.06 |