DevBoi

[JPA] QueryDsl LeftJoin,SelfJoin 본문

Develop/[JPA]

[JPA] QueryDsl LeftJoin,SelfJoin

HiSmith 2023. 8. 19. 22:30
반응형

비즈니스 로직은 정리를 안하는 편이지만 정리를 해보자

 

QueryDsl을 사용하다가 두개의 테이블을 조인

나랑 친구인 상태인 유저는 제외, 이외 모든 유저정보를 불러모으지만,

내가 친구를 신청했던 상태에 대한 정보는 추가로 들고 와야하는 비즈니스 로직 작성

 

-> LeftOuterJoin + SelfJoin + Projections.fields

다대일 연관관계 매핑 안한이유 = N+1에 대한 위험 요소가 높고, 두개를 조인했을때 오히려, 친구라는 엔티티의 자유도가 떨어진다고 판단

 

@Override
  public List<FriendResDto> findFriendRecommandList(String userId) {
    QFriend subFriends = new QFriend("subFriends");

    List<FriendResDto>  result =  queryFactory.select(
        Projections.fields(
          FriendResDto.class,
          user.userId,
          user.nickname,
          user.introduce,
          user.thumbnailImageUrl,
          subFriends.status
        )
      ).distinct()
      .from(user)
      .where(
        user.userId.notIn(
          JPAExpressions.select(friend.targetId)
            .from(friend)
            .where(friend.sourceId.eq(userId).and(friend.status.eq(FriendStatus.FRIEND.getStatus())))
        )
      )
      .leftJoin(subFriends)
      .on(user.userId.eq(subFriends.targetId).and(subFriends.sourceId.eq(userId)))
      .stream()
      .toList();

    return result;
  }

 

실제 코드에서는 모듈화로 분리를 했지만, 크게는 이런 쿼리구조로 동작을 하게끔 하였다.

반응형

'Develop > [JPA]' 카테고리의 다른 글

[Jpa] Querydsl build Setting  (0) 2023.09.02
[JPA] ElementCollection  (0) 2023.08.28
[JPA] QueryDsl 여러 기능 정리  (0) 2023.08.19
[JPA] 친구 관련 API개발  (0) 2023.08.19
[JPA] QueryDsl 친구 관련 설계  (0) 2023.08.16