HyeLog

[Spring Data JPA] @Query 조회 기능 본문

웹 개발/Spring Boot

[Spring Data JPA] @Query 조회 기능

shj718 2023. 7. 4. 20:06

@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;
	}
}