반응형
@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에 대해 알아보기
'◼ JAVA > JPA' 카테고리의 다른 글
[JPA] JPQL의 fetch join(패치 조인)이란? (2) | 2023.06.12 |
---|---|
[JPA] 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading) (0) | 2023.06.12 |
[JPA] JPQL이란? 사용방법, 기본 문법 총 정리 (1) | 2023.06.09 |
[JPA] 임베디드 타입이란? (@Embeddable) (0) | 2023.06.08 |
[JPA] Entitiy에서 왜 Setter를 사용하지 말라고 할까? (0) | 2023.06.08 |