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

wodlszz님의 프로필 이미지
wodlszz

작성한 질문수

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

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

작성

·

418

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

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

안녕하세요. wodlszz님

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

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

감사합니다.

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

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 클래스에 기본 데이터도 저장해 두었는데 왜 이렇게 나오는지 해결이 되지 않습니다.

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

안녕하세요. wodlszz님

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

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

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

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

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

https://bit.ly/3fX6ygx

 

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

 

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

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

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

 

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

wodlszz님의 프로필 이미지
wodlszz

작성한 질문수

질문하기