주문 조회 V4: JPA에서 DTO 직접 조회
475
작성한 질문수 10
주문 조회 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 명령어 필요합니다.
이 부분들을 다시 확인해보세요 🙂
감사합니다.
0
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 클래스에 기본 데이터도 저장해 두었는데 왜 이렇게 나오는지 해결이 되지 않습니다.
0
안녕하세요. wodlszz님
우선 작동이 된다면 스프링 데이터 JPA를 사용한다고 해서 JPA를 직접 사용하는 것과 특별한 차이는 없습니다.
orderItems가 null로 출력되는 이유는 기존 코드와 함께 차근차근 찾아보셔야 할 것 같아요.
차근차근 찾아보아도 해결이 안되는 경우
실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 문제 영역을 실행할 수 있는 방법
2. 문제가 어떻게 나타나는지에 대한 상세한 설명
링크: 공식 서포터즈
링크: 자주하는 질문
감사합니다.
강의 관련 외 질문입니다.
0
66
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
0
90
1
BeanCreationException
0
88
3
Update 후 UpdateMemberResponse 매핑할 때
0
47
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
99
2
페이징 + 검색조건 관련해서 질문드립니다.
0
70
1
Query Dsl Q파일 질문입니다.
0
82
1
루트 쿼리라는것은
0
58
1
메서드를 분리하는 기준
0
63
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
110
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
84
2
fetch join과 영속화와 OSIV의 관계
0
86
2
Distinct 사용 전 결과에 대한 의문
0
113
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
57
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
78
2
dto 필드 속 엔티티 여부
0
60
1
뷰템플릿 사용 시
0
76
2
Result 클래스 관련 질문
0
56
1
@PostConstruct 프록시 관련 질문드립니다
0
86
1
DTO 대신 Form 사용은 안되나요?
0
135
1
OSIV ON 상태일 때
0
96
1
fetch join VS fetch join 페이징 궁금증
0
180
2
양방향 연관관계 알아보는 법?
0
105
1
16강 17강 간단 정리 이게 맞을까요 ?
0
165
2





