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

leekhy02님의 프로필 이미지
leekhy02

작성한 질문수

실전! Querydsl

사용자 정의 리포지토리

fetch join시 에러 문제 문의입니다!

작성

·

703

1

안녕하세요 선생님!

문의사항이 있어 글 남깁니다.

 

우선 코드먼저 송부드립니다!!

[현재 상황]

  1. 현재 account, product, orderInfo 테이블에 더미데이터 모두 넣어놓은 상태 (mysql사용)

  2. orderInfo에는 현재 2번째 이미지 SearchRequestDto 생성자 내용들이 DB에 있는 상태

[querydsl 코드]

[test 코드]

[orderInfo 코드]

join만 사용하게 되었을 때는 테스트 코드에서 아래와 같이 오류가 발생하지 않습니다.

fetchjoin을 활용하였을 시에는 아래와 같은 오류가 계속 발생합니다.

오류는 아래와 같습니다.

select에 각 엔티티별 원하는 데이터를 기입하였으니, fetchjoin을 활용하면 쿼리 성능이 최적화되겠다! 라고 생각하여 fetchjoin을 활용하였는데 계속 오류가 뜹니다.

 

이런 경우에는 join절만 활용가능한 것인지 궁금합니다..!

 

추가로 제가 작성한 코드에서 문제점이 있다면 어느 곳인지 알려주실 수 있으신지 문의드립니다!!!

 

답변 2

1

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

답변내용 아래와 같이 확인하였습니다!

fetch join을 사용하는 이유는 엔티티 상태에서 엔티티 그래프를 참조하기 위해서 사용하는 것입니다. 따라서 당연히 엔티티가 아닌 DTO 상태로 조회하는 것은 불가능합니다.

이 경우 fetch join을 사용하지 마시고, 그냥 순수한 join을 사용하시면 원하는 결과를 얻을 수 있습니다^^

참고로 관련된 부분을 활용2편에서 DTO를 조회할 때 자세히 설명해드리니 참고해주세요 :)

위 부분의 내용대로라면,

select > Q클래스 활용를 활용하나, DTO형식으로 반환

join > Q클래스만을 활용함.

 

두 형태의 기준 자체가 다르기 때문에 fetchjoin이 안된다는 의미인지 문의드립니다!

 

public List<SearchResponseDto> searchAllOrders(SearchRequestDto searchRequestDto) {
    return queryFactory
            .select(new QSearchResponseDto(
                            account.name,
                            product.seller,
                            orderInfo.orderPrice,
                            product.category
                    )
            )
            .from(orderInfo)
            .join(orderInfo.product, product)
            .join(orderInfo.account, account)
            .where(
                    nameEq(searchRequestDto.getAccountName()),
                    sellerEq(searchRequestDto.getSeller()),
                    orderPriceEq(searchRequestDto.getOrderPrice()),
                    categoryEq(searchRequestDto.getCategory())
            )
            .fetch();
}

fetch join을 사용하는 이유는 DTO 때문이 아닙니다.

아래 문장을 다시 참고해주세요.

fetch join을 사용하는 이유는 엔티티 상태에서 엔티티 그래프를 참조하기 위해서 사용하는 것입니다. 따라서 당연히 엔티티가 아닌 DTO 상태로 조회하는 것은 불가능합니다.

 

fetch join은 조회 대상이 엔티티여야 합니다.

1

안녕하세요. leekhy02님, 공식 서포터즈 David입니다.

아래 글 답변을 참고해주세요:)

https://www.inflearn.com/questions/23847

감사합니다.

leekhy02님의 프로필 이미지
leekhy02

작성한 질문수

질문하기