From 1ef34310370683ba33a895a9dcef4abd502b442f Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 24 Sep 2025 13:32:57 +0900 Subject: [PATCH 1/2] =?UTF-8?q?add:=20=EC=9A=94=EC=B2=AD=EC=97=90=20?= =?UTF-8?q?=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/campick/server/api/product/dto/FilterReqDto.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/campick/server/api/product/dto/FilterReqDto.java b/src/main/java/com/campick/server/api/product/dto/FilterReqDto.java index 7de04c1..59a45ae 100644 --- a/src/main/java/com/campick/server/api/product/dto/FilterReqDto.java +++ b/src/main/java/com/campick/server/api/product/dto/FilterReqDto.java @@ -15,6 +15,7 @@ public class FilterReqDto { private Integer costTo; private Integer generationFrom; private Integer generationTo; + private String keyword; @JsonProperty("types") private List types; private List options; From 6d9b43c941edf6f082353b806a9557b44a0f403b Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 24 Sep 2025 14:04:31 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=EB=A7=A4=EB=AC=BC=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=EC=A0=9C=EB=AA=A9=20=EA=B8=B0=EC=A4=80=20=EA=B2=80?= =?UTF-8?q?=EC=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/api/product/service/ProductService.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/campick/server/api/product/service/ProductService.java b/src/main/java/com/campick/server/api/product/service/ProductService.java index 514a6cc..327cbcc 100644 --- a/src/main/java/com/campick/server/api/product/service/ProductService.java +++ b/src/main/java/com/campick/server/api/product/service/ProductService.java @@ -292,6 +292,11 @@ public PageResponseDto getProducts(FilterReqDto filter, Pageable predicates.add(cb.notEqual(productRoot.get("status"), ProductStatus.SOLD)); predicates.add(cb.isFalse(productRoot.get("isDeleted"))); + // 제목 검색 + if (filter.getKeyword() != null && !filter.getKeyword().isBlank()) { + predicates.add(cb.like(cb.lower(productRoot.get("title")), "%" + filter.getKeyword().toLowerCase() + "%")); + } + // 범위 필터 predicates.add(cb.between(productRoot.get("cost"), filter.getCostFrom(), filter.getCostTo())); predicates.add(cb.between(productRoot.get("generation"), filter.getGenerationFrom(), filter.getGenerationTo())); @@ -350,6 +355,11 @@ public PageResponseDto getProducts(FilterReqDto filter, Pageable countPredicates.add(cb.between(countRoot.get("mileage"), filter.getMileageFrom(), filter.getMileageTo())); countPredicates.add(cb.isFalse(countRoot.get("isDeleted"))); + // 제목 검색 + if (filter.getKeyword() != null && !filter.getKeyword().isBlank()) { + predicates.add(cb.like(cb.lower(productRoot.get("title")), "%" + filter.getKeyword().trim().toLowerCase() + "%")); + } + if (filter.getOptions() != null && !filter.getOptions().isEmpty()) { Subquery countOptionSub = countQuery.subquery(Long.class); Root optionRoot = countOptionSub.from(ProductOption.class);