Closed dasd412 closed 2 years ago
위 테스트 코드는 실패한다. size()가 3이 아니라 9를 리턴하기 때문이다. 이는 일지 테이블과 하위 엔티티 테이블과 조인한 결과를 전부 리턴한 결과와 같다.
해결한 방법은 다음과 같다. 조인된 테이블을 select sql로 전부 가져온 후, stream().distinct()를 활용하여 java 단에서 중복을 제거해주는 것이다.
바뀐 코드는 다음과 같다.
@Override
public List<DiabetesDiary> findDiabetesDiariesOfWriterWithRelation(Long writerId) {
return jpaQueryFactory.selectFrom(QDiabetesDiary.diabetesDiary)
.innerJoin(QDiabetesDiary.diabetesDiary.writer, QWriter.writer)
.fetchJoin()
.leftJoin(QDiabetesDiary.diabetesDiary.dietList, QDiet.diet)
.fetchJoin()
.leftJoin(QDiet.diet.foodList, QFood.food)
.fetchJoin()
.where(QDiabetesDiary.diabetesDiary.writer.writerId.eq(writerId))
.fetch().stream().distinct().collect(Collectors.toList());
}
참고한 블로그는 다음과 같다. https://dotoridev.tistory.com/2?category=0
리포지토리 코드는 다음과 같다.
테스트 코드는 다음과 같다.