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

code-tree님의 프로필 이미지
code-tree

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

회원 조회 API

여러 테이블 fetch join 질문 드립니다!

해결된 질문

작성

·

484

0

안녕하세요!

Event와 Member의 N : N 관계를 중간 테이블(EventMEmber)을 만들어서 풀어낼때

Event <-> EventMember <-> Member에서

Event를 리스트로 조회하려고 하는데 이때 EventDto에 Member의 String name 필드를 리스트로 가져오려고 합니다.

 

1.

    @Query("select distinct e from Event e " +
            "join fetch e.eventMember a " +
            "join fetch a.member")

Event에 중간 엔티티인 EventMember를 fetch join하고 별칭을 사용해서 EventMember의 member를 fetch join 했습니다.

fetch join에서 별칭 사용을 권장하지 않고, 컬렉션을 fetch join을 하면 추후 페이징에 문제가 생길 것 같습니다.

 

2.

@Query(value =
        "select e from EventMember e " +
        "join fetch e.member " +
        "join fetch e.event")
List<EventMember> eventMembers = eventMemberRepository.findAllEventArtist();
Map<Event, List<String>> events = new HashMap<>();

for (EventMember eventMember : eventMembers) {
    if (!events.containsKey(eventMember.getEvent())) {
        events.put(eventMember.getEvent(), new ArrayList<>());
    }

    events.get(eventMember.getEvent())
            .add(eventMember.getMember().getName());
}

중간 엔티티인 EventMember로 Event와 Member를 fetch join으로 가져오고 자바 코드로 원하는 응답을 만들었습니다.

 

혹시 둘중 더 나은 방법이나 더 좋은 방법, 제가 잘못 알고 있는 부분이 있으면 말씀 부탁드리겠습니다 ㅠㅠ

 

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. code-tree님

지금 필요한 것이 모든 엔티티가 필요한 것이 아니라 회원의 이름 처럼 몇가지 데이터만 필요한 상황으로 보입니다.

이런 경우에는 fetch join을 사용하는 것이 아니라 일반 join + DTO로 원하는 필드를 조회하시면 됩니다.

감사합니다.

code-tree님의 프로필 이미지
code-tree
질문자

답변 감사합니다!!

code-tree님의 프로필 이미지
code-tree

작성한 질문수

질문하기