반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 스프링부트
- JPA 공부
- nestjs공부
- 자료구조공부
- 스프링부트공부
- JPA예제
- 플러터 개발
- Axon framework
- 프로그래머스
- 기술면접공부
- Flutter
- querydsl
- 알고리즘공부
- Kafka
- 스프링공부
- 기술공부
- 플러터 공부
- 코테공부
- DDD
- JPA
- JPA공부
- K8S
- 자바공부
- 스프링
- 스프링 공부
- 코테준비
- JPA스터디
- 카프카
- nestjs스터디
- nestjs
Archives
- Today
- Total
DevBoi
[JPA] QueryDsl LeftJoin,SelfJoin 본문
반응형
비즈니스 로직은 정리를 안하는 편이지만 정리를 해보자
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 |