작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
339
0
안녕하세요 강의에서와 같이 CountQuery를 적용하였습니다.
기대 결과값 : 422개
실제 결과값 : 425개
였습니다. sql을 날려서 확인해본 결과 실제 결과값은 leftJoin하여 중복되는 행의 개수만큼 추가되어 있더라구요.
내부적으로 distinct 되어서 422개를 조회하고 싶습니다.
혹시 어떻게 해야될까요? 감사합니다.
@Override
public Page<ReputationPost> findByReputationIdAndUsable(ReputationPostsGetReqDto dto, List<String> keywordList, List<ReputationChannelReqDto> reputationChannelReqDtoList, Pageable pageable, boolean usable) {
List<ReputationPost> content = jpaQueryFactory.selectDistinct(reputationPost)
.from(reputationPost)
.join(reputationPost.post, post).fetchJoin()
.leftJoin(postKeyword).on(reputationPost.post.id.eq(postKeyword.post.id))
.leftJoin(memLawkitDoc).on(reputationPost.id.eq(memLawkitDoc.reputationPost.id))
.where(
reputationIdEq(dto.getReputationId()),
channelIdListIn(reputationChannelReqDtoList),
keywordListIn(keywordList),
durationEq(dto.getStartDate(), dto.getEndDate()),
memLawkitDocStatus(dto.getMemLawkitDocStatusList())
)
.orderBy(getSorting(dto.getSortOption()))
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
JPAQuery<Long> countQuery = jpaQueryFactory.selectDistinct(reputationPost.count())
.from(reputationPost)
.join(reputationPost.post, post)
.leftJoin(postKeyword).on(reputationPost.post.id.eq(postKeyword.post.id))
.leftJoin(memLawkitDoc).on(reputationPost.id.eq(memLawkitDoc.reputationPost.id))
.where(
reputationIdEq(dto.getReputationId()),
channelIdListIn(reputationChannelReqDtoList),
keywordListIn(keywordList),
durationEq(dto.getStartDate(), dto.getEndDate()),
memLawkitDocStatus(dto.getMemLawkitDocStatusList())
);
return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne);
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
CountQuery의 최적화 및 중복을 제거하는 방법에 대한 질문을 주셔서 관련 내용을 살펴봤습니다. 특히, left join으로 인해 중복된 행이 계산되어 예상과 다른 결과가 나오는 경우, 명시적으로 distinct
를 사용하여 중복을 제거해야 하는 상황입니다.
질문 내용에 기반하여, selectDistinct(reputationPost.count())
부분에서 직접적인 해결책을 제공하기는 어렵습니다. JPA에서 .countDistinct()
는 select(count(distinct ...))
와 같이 직접적인 SQL 표현을 지원하지 않습니다. 따라서, 중복을 제외한 정확한 개수를 얻으려면, 별도의 전략이 필요합니다.
관련 질문으로, 이전에 비슷한 문제가 제기되었었고, 이에 대한 답변이 몇 가지 있습니다. 아래 링크들에서 유사한 방법이나 개념이 적용된 예를 찾을 수 있을 겁니다. 나아가 이러한 방법들이 질문자님의 상황에 어떻게 적용될 수 있는지 참고해보시길 바랍니다.
이러한 동일한 또는 유사한 질문의 답변들은 질문자님의 상황과 완벽히 일치하지 않을 수도 있지만, countQuery에서 중복을 제거하는 방법의 참고점이 될 수 있을 겁니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.