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

김형민님의 프로필 이미지
김형민

작성한 질문수

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

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

질문이 있습니다.

작성

·

231

0

private List<OrderItemQueryDto> findOrderItems(Long orderId) {
    return em.createQuery(
            "select new jpabook.jpashop.repository.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count)" +
                    " from OrderItem oi" +
                    " join oi.item i" + //이걸 왜 하는거지 => 실 객체바꿀라고?
                    " where oi.order.id = :orderId", OrderItemQueryDto.class
    ).setParameter("orderId", orderId).getResultList();
}

위 코드에서 "join oi.item" 하는 이유가 궁금합니다.

OrderItem엔 Item이 있으니 i.name 대신 oi.item.name하여도 될 것 같은데 굳이 Item도 조인하는 이유가 있을까요?

 

제가 생각한 결과로는 Item을 조인하여 i.name할 때 Item이 프록시에서 실 객체로 바뀌니 이것을 위해 조인하였을 것 같은데 맞을까요?

답변 1

2

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

안녕하세요. 김형민님

JPA 기본편에 있는 경로 표현식 부분을 참고해주세요.

감사합니다.

김형민님의 프로필 이미지
김형민
질문자

감사합니다.

결론은 명시적 조인을 하기위해서군요.

근데 Item이 실 객체로 바뀌는 시점은 join oi.item i 인가요 i.name 인가요.. 헷갈리네요

제 생각엔 join oi.item i 이때 일 것 같습니다.

 

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

안녕하세요. 형민님

Join oi.item i 라는 표현이 있으면 select에서도 i를 사용할 수 있게 됩니다.

감사합니다.

 

김형민님의 프로필 이미지
김형민

작성한 질문수

질문하기