본문 바로가기
Back-End/JPA

querydsl 단 건 조회시 firstResult/maxResults specified with collection fetch; applying in memory!

by 어렵다어려웡 2022. 9. 2.

Querydsl

private Member getMember(Long memberId) {
        return jpaQueryFactory
                .selectFrom(member).distinct()
                .leftJoin(member.groupMember, groupMember).fetchJoin()
                .leftJoin(groupMember.group, group).fetchJoin()
                .where(member.id.eq(memberId))
                .fetchFirst();
    }

Member Entity의 코드이다.

// Member.class
@Column(name = "email", nullable = false, unique = true)
private String email;

@Column(name = "name", nullable = false)
private String name;

@Column(name = "password", nullable = false)
private String password;

@OneToMany(mappedBy = "member", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST})
private List<GroupMember> groupMember = new ArrayList<>();

 

기본적으로 One에서 Many를 조회 할 때, fetch를 쓰는 경우 limit이 적용되지 않는다고 한다.

갑자기 단건 조회인데 웬 limit을 언급하는가? 

그 이유는 fetchFirst() 가 단 건 조회를 할 때 사용되지만, 동작하는 코드를 보면 다음과 같다.

@Override
public final T fetchFirst() {
    return limit(1).fetchOne();
}

limit 을 추가로 한 뒤에, fetchOne()을 통해서 단 건을 가져온다.

 

Member (one)에서 GroupMember (Many) 를 조회할 때 무언가 fetch를 할 경우 무언가 문제가 발생한다고 한다.

 

우선은 급히 fetchFirst() 를 fetchOne() 으로 변경해서 해결을 했다.

 


출처입니다. 해당 글을 보고 이해하고 해결을 했습니다.

글이 너무 똑같아서 봤더니 동일한 작성자였습니다.

https://javabom.tistory.com/104

https://tecoble.techcourse.co.kr/post/2020-10-21-jpa-fetch-join-paging/