작성
·
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님
우선 작동이 된다면 스프링 데이터 JPA를 사용한다고 해서 JPA를 직접 사용하는 것과 특별한 차이는 없습니다.
orderItems가 null로 출력되는 이유는 기존 코드와 함께 차근차근 찾아보셔야 할 것 같아요.
차근차근 찾아보아도 해결이 안되는 경우
실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 문제 영역을 실행할 수 있는 방법
2. 문제가 어떻게 나타나는지에 대한 상세한 설명
링크: 공식 서포터즈
링크: 자주하는 질문
감사합니다.
수정해서 작동이 되었는데 postman으로 검사를 해본 결과 orderItems: null로 출력됩니다.
initDB 클래스에 기본 데이터도 저장해 두었는데 왜 이렇게 나오는지 해결이 되지 않습니다.