카테고리 없음

제안 가능한 카드들 - querydsl join을 어떻게 할것인가

born-A 2023. 11. 15. 22:17

배경

다음과 같이 나의 카드들 중, 오퍼/찔러보기를 요청하고자 하는 CardInfo와 이미 해당 카드에 내 카드가 제안된 상태인지를 담는 SuggestionInfo 가 있어야 한다.

 

문제 상황

내 카드들의 정보는 모두 채워져서 내려져야 하며,

SuggestionInfo 정보는 내 카드들 중에서 어떠한 카드가 타겟 카드에 이미 제안을 한 상태인 카드이면

정보가 채워져서 내려가고, 아니면 null로 내려가야한다.

 

나의 생각

따라서 대상 테이블은 Card이며, Suggestion을 leftjoin으로 조인해야한다.

그래야 Card의 정보는 채워지고 타겟cardId를 제안한 카드가 있을 경우에만 suggestionInfo 테이블이 채워진다.

 

작성 코드

public List<SuggestionAvailableCardResponseDTO> getSuggestionAvailableCards(
        Long userId,
        Long targetCardId, 
        Boolean pokeAvailable
    ) {
        List<SuggestionAvailableCardResponseDTO> cardList = jpaQueryFactory
            .select(
                Projections.fields(
                    SuggestionAvailableCardResponseDTO.class,
                    Projections.fields(
                        CardInfo.class,
                        card.cardId,
                        card.thumbNailImage.as("thumbnail"),
                        card.cardTitle,
                        card.item.itemName,
                        card.item.priceRange
                    ).as("cardInfo"),
                    Projections.fields(
                        SuggestionInfo.class,
                        suggestion.suggestionType,
                        suggestion.suggestionStatus
                    ).as("suggestionInfo")
                )
            )
            .from(card)
                .leftJoin(suggestion).on(suggestion.fromCard.cardId.eq(card.cardId))
                .leftJoin(suggestion).on(suggestion.toCard.cardId.eq(targetCardId)
            .where(card.user.userId.eq(userId))
            .fetch();
        return cardList;
    }