• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

Querydsl 자동 join

24.02.19 01:35 작성 24.02.19 01:40 수정 조회수 127

0

안녕하세요? JPA 활용 2편과 Querydsl 편을 수강하고 나서 코드를 작성하다가 알게 된 내용인데 원래 그런 것인지 알고 싶어서 여쭤봅니다.

JPA 활용 2편에서 Order와 member, delivery를 한번에 조회하는 OrderSimpleApiController에서 V4를 Querydsl 버전으로 바꾸었습니다.

OrderSimpleApiController.java

OrderSimpleQueryDto

@Data
public class OrderSimpleQueryDto {
    private Long orderId;
    private String name;
    private LocalDateTime orderDate;
    private OrderStatus orderStatus;
    private Address address;

    @QueryProjection
    public OrderSimpleQueryDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address){
        this.orderId = orderId;
        this.name = name; // LAZY 초기화
        this.orderDate = orderDate;
        this.orderStatus = orderStatus;
        this.address = address; // LAZY 초기화
    }
}

orderSimpleQueryRepository.findOrderDtosQuerydsl

public List<OrderSimpleQueryDto> findOrderDtosQuerydsl(){
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);

    return queryFactory
            .select(new QOrderSimpleQueryDto(
                    order.id.as("orderId"),
                    order.member.name,
                    order.orderDate,
                    order.status,
                    order.delivery.address)
            )
            .from(order)
            .fetch();
}

이렇게 V4버전을 바꿨는데, 딱히 제가 join을 날린 게 없는데 join이 날라갑니다. 오히려 제가 fetchJoin용으로 코드를 작성하려고 from절의 아랫 부분에 다른 코드를 작성하는게 불가능했습니다. join(order.delivery, order).fetchJoin() 같은 코드는 작성이 안되고 join(order.delivery).fetchJoin()은 semantic 오류라는 에러코드가 날라옵니다.

Dto로 작성할 때 여러 테이블을 페치 조인해야하는 상황에서는 Querydsl을 어떻게 사용해야하나요?

 

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

답변 1

답변을 작성해보세요.

1

y2gcoder님의 프로필

y2gcoder

2024.02.19

안녕하세요. 백명규님, 공식 서포터즈 y2gcoder입니다.

fetch join은 엔티티 상태에서 엔티티 그래프를 참조하기 위한 방법입니다! 그래서 DTO의 fetch join은 불가능합니다! 다음 링크(클릭)을 참조해주십쇼!

감사합니다.

백명규님의 프로필

백명규

질문자

2024.02.19

확인했습니다! 감사합니다!