인프런 커뮤니티 질문&답변

wodlszz님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V4: JPA에서 DTO 직접 조회

24.01.15 17:01 작성

·

401

0

주문 조회 V4: JPA에서 DTO 직접 조회 강의에서

OrderQueryRepository를 스프링데이터JPA를 이용해 변경하려하는데 잘 되지않아서 질문하게 되었습니다.

(변수명이 바뀐 것은 제가 강의를 보면서 좀 수정해가며 작성하였습니다.)

package jaein.crudpractice.repository.order.query;

import jaein.crudpractice.domain.Order;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface OrderQueryRepository extends JpaRepository<Order, Long> {


//    @Query("select o from Order o" +
//            " join fetch o.student s" +
//            " join fetch o.loan l")
//    List<OrderQueryDto> findOrderQueryDtos();

//    @Query("select o.id as orderId, s.name as name, o.loanDate, o.returnDate, o.status, " +
//            "oi.id as itemId, i.name as itemName " +
//            "from Order o " +
//            "join o.student s " +
//            "join o.loan l " +
//            "join OrderItem oi on oi.order.id = o.id " +
//            "join oi.item i")
//    List<OrderQueryDto> findOrderQueryDtos(Pageable pageable);

    @Query("select o.id, s.name, o.loanDate, o.returnDate, o.status " +
            "from Order o " +
            "join fetch o.student s " +
            "join fetch o.loan l " +
            "join fetch OrderItem oi on oi.order.id = o.id")
    List<OrderQueryDto> findOrderQueryDtos(Pageable pageable);


//    @Query("select oi.order.id, i.name, oi.orderPrice, oi.count " +
//            "from OrderItem oi join oi.item i where oi.order.id = :orderId")
//    List<OrderItemQueryDto> findOrderItems(Long orderId);

    @Query("select oi from OrderItem oi" +
            " join oi.item i where oi.order.id = :orderId")
    List<OrderItemQueryDto> findOrderItems(@Param("orderId") Long orderId);


}
package jaein.crudpractice.repository.order.query;

import jaein.crudpractice.domain.OrderStatus;
import lombok.Data;

import java.util.Date;
import java.util.List;

@Data
public class OrderQueryDto {

    private Long orderId;
    private String name;
    private Date loanDate;
    private Date returnDate;
    private OrderStatus status;
    private List<OrderItemQueryDto> orderItems;

    public OrderQueryDto(Long orderId, String name, Date loanDate,
                         Date returnDate, OrderStatus status, List<OrderItemQueryDto> orderItems) {
        this.orderId = orderId;
        this.name = name;
        this.loanDate = loanDate;
        this.returnDate = returnDate;
        this.status = status;
        this.orderItems = orderItems;
    }
}
package jaein.crudpractice.repository.order.query;

import lombok.Data;

@Data
public class OrderItemQueryDto {

    private Long orderId;
    private String itemName;
    private int count;

    public OrderItemQueryDto(Long orderId, String itemName, int count) {
        this.orderId = orderId;
        this.itemName = itemName;
        this.count = count;
    }
}

 

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

2024. 01. 16. 18:09

안녕하세요. wodlszz님

query가 강의 내용과 다릅니다. DTO로 조회하는 경우 JPQL에서 new 명령어 필요합니다.

이 부분들을 다시 확인해보세요 🙂

감사합니다.

wodlszz님의 프로필 이미지
wodlszz
질문자

2024. 01. 17. 15:58

package jaein.crudpractice.repository.order.query;

import jaein.crudpractice.domain.Order;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface OrderQueryRepository extends JpaRepository<Order, Long> {


//    @Query("select new jaein.crudpractice.repository.order." +
//            "query.OrderQueryDto(o.id, s.name, o.loanDate, o.returnDate, o.orderItems)" +
//            " from Order o" +
//            " join o.student s" +
//            " join o.loan l" +
//            " join o.orderItems oi")
//    List<OrderQueryDto> findOrderQueryDtos(Pageable pageable);

    @Query("select new jaein.crudpractice.repository.order.query.OrderQueryDto(" +
            "o.id, s.name, o.loanDate, o.returnDate, oi)" +
            " from Order o" +
            " join o.student s" +
            " join o.orderItems oi")
    List<OrderQueryDto> findOrderQueryDtos(Pageable pageable);


    @Query("select new jaein.crudpractice.repository.order.query.OrderItemQueryDto(" +
            "oi.order.id, i.name, oi.count)" +
            " from OrderItem oi " +
            " join oi.item i " +
            " where oi.order.id = :orderId")
    List<OrderItemQueryDto> findOrderItems(@Param("orderId") Long orderId);

}

수정해서 작동이 되었는데 postman으로 검사를 해본 결과 orderItems: null로 출력됩니다.

initDB 클래스에 기본 데이터도 저장해 두었는데 왜 이렇게 나오는지 해결이 되지 않습니다.

김영한님의 프로필 이미지
김영한
지식공유자

2024. 01. 17. 19:13

안녕하세요. wodlszz님

우선 작동이 된다면 스프링 데이터 JPA를 사용한다고 해서 JPA를 직접 사용하는 것과 특별한 차이는 없습니다.

orderItems가 null로 출력되는 이유는 기존 코드와 함께 차근차근 찾아보셔야 할 것 같아요.

차근차근 찾아보아도 해결이 안되는 경우

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

 

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

wodlszz님의 프로필 이미지

작성한 질문수

질문하기