Back-End/JPA
querydsl 단 건 조회시 firstResult/maxResults specified with collection fetch; applying in memory!
어렵다어려웡
2022. 9. 2. 23:53
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/