SQL에서 %를 사용하면 해당 위치에 어떤 문자열이든 올 수 있다는 것을 착안하여
검색단어가 포함된 데이터 조회 API를 만들었다.
방법!
1. 쿼리스트링으로 검색할 단어를 받는다.
2. String 검색단어 = %쿼리스트링으로받은검색단어%
3. Repository에서 검색단어를 활용하여 쿼리문을 작성한다.
@ApiOperation(value = "상품 검색")
@GetMapping("/search") // ?pageNumber=1&searchWord=반바지
public ResponseEntity<List<GetProductDto>> searchProduct(
@RequestParam(name = "pageNumber", required = false, defaultValue = "1") Integer pageNumber,
@RequestParam(name = "searchWord", required = false, defaultValue = "") String searchWord,
@RequestParam(name = "ageCategory", required = false, defaultValue = "") String ageCategory,
@RequestParam(name = "genderCategory", required = false, defaultValue = "") String genderCategory,
@RequestParam(name = "sortBy", required = false, defaultValue = "id") String sortBy
){
return ResponseEntity.ok(productService.searchProducts(pageNumber, searchWord, ageCategory,genderCategory, sortBy));
}
@Transactional(readOnly = true)
public List<GetProductDto> searchProducts(Integer pageNumber, String searchWord, String ageCategory, String genderCategory, String sortBy) {
String inputAgeCategory = AgeCategoryEnum.switchCategory(ageCategory);
String inputGenderCategory = GenderCategoryEnum.switchCategory(genderCategory);
Pageable pageable = PageRequest.of(pageNumber - 1, 15); //한 페이지 15개
String searchToken = "%"+searchWord+"%";
if (Objects.equals(sortBy, "price")) {
return productRepository.searchProductSortByPrice(searchToken, inputAgeCategory,inputGenderCategory, pageable);
// return productList.stream().map(ProductDto::fromEntity).collect(Collectors.toList());
}else if(Objects.equals(sortBy, "createdAt")) {
return productRepository.searchProductSortByCreatedAt(searchToken,inputAgeCategory,inputGenderCategory, pageable);
// return productList.stream().map(ProductDto::fromEntity).collect(Collectors.toList());
}else {
return productRepository.searchProductSortById(searchToken,inputAgeCategory,inputGenderCategory, pageable);
}
}
@Query(value="SELECT NEW com.github.commerce.web.dto.product.GetProductDto(p.id, p.name, p.price,p.createdAt, p.productCategory, p.ageCategory, p.genderCategory, p.leftAmount, p.thumbnailUrl, p.seller.shopName) " +
"FROM Product p " +
"WHERE (:inputAgeCategory IS NULL OR p.ageCategory = :inputAgeCategory) " +
"AND (:inputGenderCategory IS NULL OR p.genderCategory = :inputGenderCategory) " +
"AND p.isDeleted = false " +
"AND p.name LIKE :searchToken " +
"ORDER BY p.price ASC"
)
List<GetProductDto> searchProductSortByPrice(
@Param("searchToken")String searchToken,
@Param("inputAgeCategory")String inputAgeCategory,
@Param("inputGenderCategory")String inputGenderCategory,
@Param("pageable")Pageable pageable
);