[JPA] 사용자 정의 쿼리 작성과 파라미터 바인딩(@Query, @Param)

@Query

Spring Data JPA를 사용할 때, 개발자가 원하는 쿼리를 직접 짜야 한다면, @Query 어노테이션을 사용하여 직접 쿼리를 작성할 수 있다.

@Query 안에서 작성한 JPQL에 오타가 있다면 애플리케이션 실행 시점에 문법 오류를 발견할 수 있다.

 

@Query는 JpaRepository를 상속하는 인터페이스에서 사용할 수 있다.

public interface UserRepository extends JpaRepository<User, Long> {
    
    @Query("JPQL 쿼리작성")
    List<User> method();
}

 

만약 나이가 18살 이상인 유저를 조회하는 쿼리를 작성해보면 다음과 같이 작성할 수 있다.

public interface UserRepository extends JpaRepository<User, Long> {
    
    @Query("select u from User as u where u.age > 18")
    List<User> findAdultUser();
}

 

NatvieQuery

해당 옵션을 사용하면 JPQL이 아닌 SQL을 직접 정의하여 사용할 수도 있다.

끝에 nativeQuery = true 옵션을 넣어주면된다.

문법은 기본 SQL 문법과 동일하다.

public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "SELECT * FROM User", nativeQuery = true)
    List<Post> findAllUser();
}

 


파라미터 바인딩 @Param

쿼리를 작성할 때 파라미터를 통한 구체적인 조건을 줘야하는 경우가 있다.

그럴 경우 @Param  어노테이션을 통해 파라미터를 바인딩할 수 있다.

바인딩 하는 방법은 다음과 같다.

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("select u from User u where u.username = :name")
    List<User> methodName(@Param("name") String username);
}

DTO 직접 조회와 컬렉션 파라미터 바인딩

DTO 직접 조회

DTO로 직접 조회 하려면 new 명령어를 사용해야 한다.

그리고 다음과 같이 생성자와 타입이 맞는 DTO가 필요하다.

@Query("select new study.data.jpa.dto.MemberDto(m.id, m.username, t.name) from Member m join m.team t")
List<MemberDto> findMemberDto();

 

컬렉션 파라미터 바인딩

Collection 타입으로 in절 지원

@Query("select m from Member m where m.username = :name")
Member findMembers(@Param("name") String username)

 


JPQL에 대해 알아보기
 

[JPA] JPQL이란? 사용방법, 기본 문법 총 정리

JPQL (Java Persistence Query Language)이란 ? JPQL은 엔티티 객체를 대상으로 하는 쿼리 언어이다. JPQL의 문법을 보면 다음과 같다. (나이가 18살 이상인 유저를 조회) select u from User as u where u.age > 18 JPQL은 SQL

hstory0208.tistory.com