-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
querydsl countQuery
24.05.30 18:25 작성 조회수 83
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);
}
답변을 작성해보세요.
0
인프런 AI 인턴
2024.05.30
안녕하세요, 인프런 AI 인턴입니다.
CountQuery의 최적화 및 중복을 제거하는 방법에 대한 질문을 주셔서 관련 내용을 살펴봤습니다. 특히, left join으로 인해 중복된 행이 계산되어 예상과 다른 결과가 나오는 경우, 명시적으로 distinct
를 사용하여 중복을 제거해야 하는 상황입니다.
해결 방안
질문 내용에 기반하여, selectDistinct(reputationPost.count())
부분에서 직접적인 해결책을 제공하기는 어렵습니다. JPA에서 .countDistinct()
는 select(count(distinct ...))
와 같이 직접적인 SQL 표현을 지원하지 않습니다. 따라서, 중복을 제외한 정확한 개수를 얻으려면, 별도의 전략이 필요합니다.
- Subquery 활용: 중복을 제거한 결과를 서브 쿼리로 가져온 후, 이를 바탕으로 카운트를 진행하는 방식입니다.
- JPQL에서 distinct 처리 후, count 적용: JPQL을 사용하여 distinct 처리가 된 결과 집합의 크기를 계산하는 방법도 고려할 수 있습니다.
유사한 질문과 답변
관련 질문으로, 이전에 비슷한 문제가 제기되었었고, 이에 대한 답변이 몇 가지 있습니다. 아래 링크들에서 유사한 방법이나 개념이 적용된 예를 찾을 수 있을 겁니다. 나아가 이러한 방법들이 질문자님의 상황에 어떻게 적용될 수 있는지 참고해보시길 바랍니다.
- countQuery 최적화 질문: 여기서는 countQuery의 최적화 방법에 대해 논의하고 있습니다.
- Querydsl4RepositorySupport.applyPagination의 countQuery질문: applyPagination 메소드와 관련하여 fetchCount를 어떻게 대체할지에 대한 질문 및 답변이 포함되어 있습니다.
- countQuery 최적화 부분: CountQuery 최적화에 대한 논의와 강의 내용이 언급되어 있습니다.
- PageableExecutionUtils.getPage 의 최적화 로직만 따로 뺀 count 메소드입니다.: PageableExecutionUtils를 사용한 count 쿼리의 최적화 기법을 제안합니다.
이러한 동일한 또는 유사한 질문의 답변들은 질문자님의 상황과 완벽히 일치하지 않을 수도 있지만, countQuery에서 중복을 제거하는 방법의 참고점이 될 수 있을 겁니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 1