@Query 어노테이션을 이용해서 엔티티 뿐만아니라 단일값과 DTO형태로도 리턴받을 수 있다.
다음예제를 보자 먼저
단일값으로 리턴받는 경우이다.
@Query("select m.name from Member m where m.id= :id")
String findByIdValue(@Param("id")Long id);
먼저 JPARepository를 상속받는 인터페이스에 구현한다.
사용할 컬럼을 셀렉트에서 명시하면되서 단순하다.
@GetMapping("queryMethodValueTest")
public String queryMethodValueTest(Long id){
return memberDataJpaRepository.findByIdValue(id);
}
해당 메소드를 호출하는 컨트롤러에서 호출하면 된다.
다음은 DTO로 리턴받는예제이다.
@Query("select new com.example.jpabook.dto.MemberDto(m.id,m.email,m.name) from Member m where m.name= :name")
MemberDto findByNameDto(@Param("name") String username);
추출할 필드들을 DTO생성자 파라미터로 사용한다. 여기서 new연산자를 사용하는데 해당 DTO의 풀패키지경로를 적어야한다. 이게 좀 가독성이 안좋은것 같다....
해당메소드도 컨트롤러에서 호출하면 결과가 DTO로 반환되어 정상적으로 나온다.
@GetMapping("queryMethodDtoTest")
public MemberDto queryMethodDtoTest(String name){
return memberDataJpaRepository.findByNameDto(name);
}
{
"id": 1,
"email": null,
"pw": null,
"name": "userA"
}
DTO로 반환받는 방법은 자주 사용할 거 같긴하다. 일단 API서버에서는 엔티티타입으로 리턴하는 것을 지양해야한다.(스키마 노출 및 api 스펙의 변화방지) 그렇기 때문에 DTO로 리턴하게된다. 물론 엔티티타입을 dto타입으로 바꿀떄 modelmapper같은 라이브러리도 있지만 바로 DTO로 반환받고 리턴하는것도 효율적인 것 같다.
'JPA' 카테고리의 다른 글
Data JPA 반환타입 (0) | 2023.10.11 |
---|---|
Data JPA collection 파라미터 바인딩 (0) | 2023.10.11 |
Data JPA 쿼리메소드 (0) | 2023.10.10 |
변경감지 (0) | 2023.10.06 |
Join vs Fetch Join (1) | 2023.10.04 |