diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/calculate/AdminChatCalculateQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/calculate/AdminChatCalculateQueryRepository.kt index 3eecc5e..defc36b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/calculate/AdminChatCalculateQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/calculate/AdminChatCalculateQueryRepository.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.admin.chat.calculate import com.querydsl.core.types.Projections import com.querydsl.core.types.dsl.CaseBuilder +import com.querydsl.core.types.dsl.Expressions import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.can.use.CanUsage import kr.co.vividnext.sodalive.can.use.QUseCan.useCan @@ -50,16 +51,25 @@ class AdminChatCalculateQueryRepository( val c2 = QChatCharacter("c2") val characterIdExpr = c1.id.coalesce(c2.id) - val characterNameExpr = c1.name.coalesce(c2.name) - val characterImagePathExpr = c1.imagePath.coalesce(c2.imagePath) + // ONLY_FULL_GROUP_BY 대응: name/imagePath는 집계 함수로 선택 + val characterNameAgg = Expressions.stringTemplate( + "coalesce(max({0}), max({1}))", + c1.name, + c2.name + ) + val characterImagePathAgg = Expressions.stringTemplate( + "coalesce(max({0}), max({1}))", + c1.imagePath, + c2.imagePath + ) val query = queryFactory .select( Projections.constructor( ChatCharacterCalculateQueryData::class.java, characterIdExpr, - characterNameExpr, - characterImagePathExpr.prepend("/").prepend(imageHost), + characterNameAgg, + characterImagePathAgg.prepend("/").prepend(imageHost), imageSum, messageSum, quotaSum @@ -81,7 +91,7 @@ class AdminChatCalculateQueryRepository( .and(useCan.createdAt.goe(startUtc)) .and(useCan.createdAt.loe(endInclusiveUtc)) ) - .groupBy(characterIdExpr, characterNameExpr, characterImagePathExpr) + .groupBy(characterIdExpr) when (sort) { ChatCharacterCalculateSort.TOTAL_SALES_DESC ->