HyeLog
[Spring Data JPA] @Query 조회 기능 본문
@Query
개발하다보면 JPA의 Query Methods만으로는 조회가 불가능한 경우가 있을 것이다.
또한 메소드 이름으로 쿼리 생성 기능(Query Method)을 사용하다보면 메소드 이름이 지저분해지는 단점이 있다.
이럴 때 사용하는 것이 @Query 이다.
@Query 는 Repository에 바로 작성한다.
Repository 에 메소드를 정의하고, @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 username, @Param("age") int
age);
}
@Query 는 애플리케이션 실행 시점에 문법 오류를 발견할 수 있다는 매우 큰 장점이 있다.
@Query 는 실무에서 많이 사용되는 기능이니 꼭 알아두자!
메소드 이름으로 쿼리 생성 기능도 간단한 정적 쿼리를 할 때는 실무에서 많이 사용되므로 같이 알아두자. 보다 더 복잡한 정적 쿼리일 땐 @Query 를 사용하자. (동적 쿼리는 QueryDSL을 사용한다.)
이제 @Query 로 '엔티티'가 아닌 '다른 값'을 조회하는 방법을 알아보자.
단순 값 조회
@Query("select m.username from Member m")
List<String> findUsernameList();
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가 필요하다.
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;
}
}
'웹 개발 > Spring Boot' 카테고리의 다른 글
[Spring Data JPA] N+1 문제, Fetch Join 및 Entity Graph 로 해결 (0) | 2023.07.05 |
---|---|
[Spring Data JPA] SQL의 IN - 컬렉션 파라미터 바인딩 (0) | 2023.07.04 |
[김영한_자바 ORM 표준 JPA 프로그래밍 - 기본편] 8. 값 타입 (0) | 2022.06.18 |
[김영한_자바 ORM 표준 JPA 프로그래밍 - 기본편] 7. CASCADE와 고아 객체 (0) | 2022.06.18 |
[김영한_자바 ORM 표준 JPA 프로그래밍 - 기본편] 7. 프록시와 연관관계 관리 (0) | 2022.06.17 |