From 466b36e3e6516203e94b5ca3960a559b78c2c5d6 Mon Sep 17 00:00:00 2001 From: krkarma777 Date: Sat, 2 Mar 2024 01:39:04 +0900 Subject: [PATCH] fix : #1 issue fix -https://blog.naver.com/krkarma777/223370503986 --- .../product/ProductForSalesVolumeSortDTO.java | 15 +---- .../repository/product/ProductRepository.java | 4 +- .../service/product/ProductService.java | 62 +++++++++++++++++-- .../product/ProductSearchController.java | 18 +++--- 4 files changed, 70 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/bulkpurchase/domain/dto/product/ProductForSalesVolumeSortDTO.java b/src/main/java/com/bulkpurchase/domain/dto/product/ProductForSalesVolumeSortDTO.java index 89678313..f86a24be 100644 --- a/src/main/java/com/bulkpurchase/domain/dto/product/ProductForSalesVolumeSortDTO.java +++ b/src/main/java/com/bulkpurchase/domain/dto/product/ProductForSalesVolumeSortDTO.java @@ -13,33 +13,20 @@ public class ProductForSalesVolumeSortDTO { private String productName; private Double price; private Integer stock; - private String username; // 판매자 이름 private List imageUrls; private Long totalQuantity; private User user; - public ProductForSalesVolumeSortDTO(Long productID, String productName, Double price, Integer stock, String username, List imageUrls, Long totalQuantity, User user) { + public ProductForSalesVolumeSortDTO(Long productID, String productName, Double price, Integer stock, List imageUrls, Long totalQuantity, User user) { this.productID = productID; this.productName = productName; this.price = price; this.stock = stock; - this.username = username; this.imageUrls = imageUrls; this.totalQuantity = totalQuantity; this.user = user; } - public ProductForSalesVolumeSortDTO(Long productID, String productName, Double price, Integer stock, String username, Long totalQuantity, User user) { - this.productID = productID; - this.productName = productName; - this.price = price; - this.stock = stock; - this.username = username; - this.totalQuantity = totalQuantity; - this.user = user; - } - - public ProductForSalesVolumeSortDTO() { } diff --git a/src/main/java/com/bulkpurchase/domain/repository/product/ProductRepository.java b/src/main/java/com/bulkpurchase/domain/repository/product/ProductRepository.java index 5f70fabd..f4b4929f 100644 --- a/src/main/java/com/bulkpurchase/domain/repository/product/ProductRepository.java +++ b/src/main/java/com/bulkpurchase/domain/repository/product/ProductRepository.java @@ -48,10 +48,10 @@ public interface ProductRepository extends JpaRepository { List findAllProducts(); @Query(value = "SELECT new com.bulkpurchase.domain.dto.product.ProductForSalesVolumeSortDTO" + - "(p.productID, p.productName, p.price, p.stock, p.user.username,SUM(od.quantity) , p.user)" + + "(p.productID, p.productName, p.price, p.stock, p.user.username, p.imageUrls,SUM(od.quantity) , p.user)" + "FROM OrderDetail od JOIN od.product p " + "WHERE p.productName LIKE %:productName% " + - "GROUP BY p.productID, p.productName, p.price, p.stock, p.user.username,od.order, p.user " + + "GROUP BY p.productID, p.productName, p.price, p.stock, p.user.username, p.imageUrls,od.order, p.user " + "ORDER BY SUM(od.quantity) DESC", countQuery = "SELECT COUNT(DISTINCT p.productID) " + "FROM OrderDetail od JOIN od.product p " + diff --git a/src/main/java/com/bulkpurchase/domain/service/product/ProductService.java b/src/main/java/com/bulkpurchase/domain/service/product/ProductService.java index e8b456c6..c2cf13bd 100644 --- a/src/main/java/com/bulkpurchase/domain/service/product/ProductService.java +++ b/src/main/java/com/bulkpurchase/domain/service/product/ProductService.java @@ -2,16 +2,20 @@ import com.bulkpurchase.domain.dto.product.ProductForCouponDTO; import com.bulkpurchase.domain.dto.product.ProductForSalesVolumeSortDTO; +import com.bulkpurchase.domain.entity.product.Product; import com.bulkpurchase.domain.entity.user.User; import com.bulkpurchase.domain.enums.ProductStatus; +import com.bulkpurchase.domain.repository.product.ProductRepository; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; -import com.bulkpurchase.domain.entity.product.Product; -import com.bulkpurchase.domain.repository.product.ProductRepository; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -21,6 +25,7 @@ public class ProductService { private final ProductRepository productRepository; + private final EntityManager entityManager; public List findPopularProductsByCategory(Long categoryID) { return productRepository.findPopularProductsByCategory(categoryID); @@ -82,7 +87,56 @@ public Page findPageByProductNameContaining(Pageable pageable, String p return productRepository.findByProductNameContaining(pageable, productName); } - public Page findProductsBySearchTermAndSortBySalesVolume(String productName, Pageable pageable) { - return productRepository.findByProductNameContainingAndOrderBySalesVolume(productName, pageable); + public Page findProductsBySalesVolume(String productName, Pageable pageable) { + String sql = "SELECT p.PRODUCTID as productID, p.PRODUCT_NAME as productName, p.PRICE as price, p.STOCK as stock, u.USERNAME as username, SUM(od.quantity) as totalQuantity " + + "FROM order_details od " + + "JOIN products p ON od.PRODUCTID = p.PRODUCTID " + + "JOIN users u ON p.USERID = u.USERID " + + "WHERE p.product_name LIKE :productName " + + "GROUP BY p.PRODUCTID, u.USERNAME, p.STOCK, p.PRICE, p.PRODUCT_NAME " + + "ORDER BY totalQuantity DESC"; + + Query query = entityManager.createNativeQuery(sql); + query.setParameter("productName", "%" + productName + "%"); + + // 페이징 처리 + int totalRows = query.getResultList().size(); // 전체 결과 수 + query.setFirstResult((int) pageable.getOffset()); // 페이징 시작점 + query.setMaxResults(pageable.getPageSize()); // 페이지 크기 + + List results = query.getResultList(); + List products = new ArrayList<>(); + for (Object[] result : results) { + User user = new User(); + user.setUsername((String) result[4]); + + products.add(new ProductForSalesVolumeSortDTO( + ((Number) result[0]).longValue(), // productID + (String) result[1], // productName + ((Number) result[2]).doubleValue(), // price + ((Number) result[3]).intValue(), // stock + null, // imageUrls 추후 추가 + ((Number) result[5]).longValue(), // totalQuantity + user // User= + )); + } + + return new PageImpl<>(products, pageable, totalRows); + } + + public List findImageUrlsByProductId(Long productID) { + String sql = "SELECT IMAGE_URL FROM KRKARMA777.PRODUCT_IMAGE_URLS WHERE PRODUCTID = :productID"; + Query query = entityManager.createNativeQuery(sql); + query.setParameter("productID", productID); + return query.getResultList(); + } + + public List completeProductDTOs(List products) { + for (ProductForSalesVolumeSortDTO product : products) { + List imageUrls = findImageUrlsByProductId(product.getProductID()); + product.setImageUrls(imageUrls); + } + return products; } + } diff --git a/src/main/java/com/bulkpurchase/web/controller/product/ProductSearchController.java b/src/main/java/com/bulkpurchase/web/controller/product/ProductSearchController.java index e865845a..a2a35118 100644 --- a/src/main/java/com/bulkpurchase/web/controller/product/ProductSearchController.java +++ b/src/main/java/com/bulkpurchase/web/controller/product/ProductSearchController.java @@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; +import java.util.List; + @Controller @RequiredArgsConstructor public class ProductSearchController { @@ -36,20 +38,17 @@ public String productSearchView(@RequestParam(value = "q", required = false) Str if (sortDir == null) { sortDir = "desc"; } - if (productName == null) { - return "redirect:/"; - } - - if (sortField == null) { sortField = "productID"; } - + if (productName == null) { + return "redirect:/"; + } if (sortField.equals("salesVolume")) { - Page productPage = productService.findProductsBySearchTermAndSortBySalesVolume(productName, PageRequest.of(page - 1, size)); + Page initialProductsPage = productService.findProductsBySalesVolume(productName, PageRequest.of(page - 1, size)); + List productPage = productService.completeProductDTOs(initialProductsPage.getContent()); model.addAttribute("productPage", productPage); - model.addAttribute("totalPages", productPage.getTotalPages()); - System.out.println("productPage = " + productPage); + model.addAttribute("totalPages", initialProductsPage.getTotalPages()); } else { Sort sort = Sort.by(Sort.Direction.fromString(sortDir), sortField); Pageable pageable = PageRequest.of(page-1, size, sort); @@ -64,4 +63,5 @@ public String productSearchView(@RequestParam(value = "q", required = false) Str model.addAttribute("sortDir", sortDir); return "product/productSearchView"; } + }