From c9813e88bc380b374429817bf3492a6402c8d011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EC=9A=A9=EC=A4=80?= Date: Mon, 2 Feb 2026 00:39:22 +0900 Subject: [PATCH] Merge pull request #311 from Clokey-dev/fix/#310-lookbook-query MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [fix/#310] 룩북 쿼리 및 계절 추천 쿼리 오류 해결 --- .../cloth/repository/ClothRepositoryImpl.java | 16 +++++++--------- .../repository/LookBookRepositoryImpl.java | 16 +++++++++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/clokey-api/src/main/java/org/clokey/domain/cloth/repository/ClothRepositoryImpl.java b/clokey-api/src/main/java/org/clokey/domain/cloth/repository/ClothRepositoryImpl.java index 7b6d66c9..6b7241b7 100644 --- a/clokey-api/src/main/java/org/clokey/domain/cloth/repository/ClothRepositoryImpl.java +++ b/clokey-api/src/main/java/org/clokey/domain/cloth/repository/ClothRepositoryImpl.java @@ -35,20 +35,22 @@ public Slice findAllMemberRecommendClothesByCategory Season nextSeason = season.next(); Season previousSeason = season.previous(); Season oppositeSeason = season.next().next(); + List targetSeasons = List.of(season, nextSeason, previousSeason, oppositeSeason); // 우선 순위에 맞게 페이징 합니다. // - Category는 고정입니다. // - 계절은 요청한 계절에 가까운 순서대로 페이징을 진행합니다. NumberExpression seasonPriority = new CaseBuilder() - .when(cloth.seasons.contains(season)) + .when(cloth.seasons.any().in(List.of(season))) .then(1) .when( cloth.seasons - .contains(nextSeason) - .or(cloth.seasons.contains(previousSeason))) + .any() + .in(List.of(nextSeason)) + .or(cloth.seasons.any().in(List.of(previousSeason)))) .then(2) - .when(cloth.seasons.contains(oppositeSeason)) + .when(cloth.seasons.any().in(List.of(oppositeSeason))) .then(3) .otherwise(4); @@ -58,11 +60,7 @@ public Slice findAllMemberRecommendClothesByCategory .where( cloth.category.id.eq(categoryId), cloth.member.id.eq(memberId), - cloth.seasons - .contains(season) - .or(cloth.seasons.contains(nextSeason)) - .or(cloth.seasons.contains(previousSeason)) - .or(cloth.seasons.contains(oppositeSeason))) + cloth.seasons.any().in(targetSeasons)) .orderBy(seasonPriority.asc(), cloth.id.asc()) .fetch(); diff --git a/clokey-api/src/main/java/org/clokey/domain/lookbook/repository/LookBookRepositoryImpl.java b/clokey-api/src/main/java/org/clokey/domain/lookbook/repository/LookBookRepositoryImpl.java index 8f70e5d1..8276ba72 100644 --- a/clokey-api/src/main/java/org/clokey/domain/lookbook/repository/LookBookRepositoryImpl.java +++ b/clokey-api/src/main/java/org/clokey/domain/lookbook/repository/LookBookRepositoryImpl.java @@ -9,6 +9,7 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.List; import lombok.RequiredArgsConstructor; +import org.clokey.coordinate.entity.QCoordinate; import org.clokey.domain.lookbook.dto.response.LookBookListResponse; import org.clokey.global.paging.SortDirection; import org.springframework.data.domain.PageRequest; @@ -25,6 +26,8 @@ public class LookBookRepositoryImpl implements LookBookRepositoryCustom { @Override public Slice findAllLookBookByMemberId( Long currentMemberId, Long lastLookBookId, int size, SortDirection direction) { + QCoordinate firstCoordinate = new QCoordinate("firstCoordinate"); + List results = queryFactory .select( @@ -35,12 +38,15 @@ public Slice findAllLookBookByMemberId( JPAExpressions.select(coordinate.count()) .from(coordinate) .where(coordinate.lookBook.id.eq(lookBook.id)), - JPAExpressions.select(coordinate.imageUrl) - .from(coordinate) - .where(coordinate.lookBook.id.eq(lookBook.id)) - .orderBy(coordinate.id.asc()) - .limit(1))) + firstCoordinate.imageUrl)) .from(lookBook) + .leftJoin(firstCoordinate) + .on( + firstCoordinate.lookBook.id.eq(lookBook.id), + firstCoordinate.id.eq( + JPAExpressions.select(coordinate.id.min()) + .from(coordinate) + .where(coordinate.lookBook.id.eq(lookBook.id)))) .where( lookBook.member.id.eq(currentMemberId), lastLookBookIdCondition(lastLookBookId, direction))