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; 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);