Применить ценовой фильтр в запросе JPA

#mysql #spring #spring-boot #jpa #spring-data-jpa

#mysql #весна #весенняя загрузка #jpa #spring-data-jpa

Вопрос:

Я использую Spring boot JPA. Я хочу отфильтровать результаты по низкой цене до высокой цены продукта. Запрос работает нормально без использования атрибута price, но когда я добавляю фильтр по цене, он выдает пустой список. Тем не менее, запрос работает в MySQL workbench и дает соответствующие результаты. Может кто-нибудь помочь с этой проблемой, почему я получаю пустой результат?

Репозиторий:

 @Query("SELECT new com.example.demo.model.CustomerProductDTO(vp.vendorproductid, p.name, vp.price, CASE quantitykg WHEN NULL THEN vp.quantitybundle ELSE vp.quantitykg END, p.image) FROM vendorproduct vp JOIN vp.product p ON p.productid = vp.productid WHERE vp.vendorid=:vendorid AND vp.price>=:minprice AND vp.price<=:maxprice ORDER BY vp.price")
    
List<CustomerProductDTO> getProductsLowToHigh(String vendorid, float minprice, float maxprice, Pageable p);
  

Контроллер:

 @GetMapping("/products/{vendorid}")
public List<CustomerProductDTO> getCustomerProducts(@PathVariable("vendorid") String vendorid,
    @RequestParam Map<String, String> map) {

    List<CustomerProductDTO> customerProductDTOs = new ArrayList<CustomerProductDTO>();
    Pageable p = PageRequest.of(0, 10);

    if (map.get("minprice").equals("null") amp;amp; map.get("maxprice").equals("null")) {
        customerProductDTOs = vendorProductRepo.getProductsLowToHigh(vendorid, p);
    }
    else {
        Float minPrice = Float.valueOf(map.get("minprice"));
        Float maxPrice = Float.valueOf(map.get("maxprice"));

        customerProductDTOs = vendorProductRepo.getProductsLowToHigh(vendorid, minPrice, maxPrice, p);
    }       
    return customerProductDTOs;
}
  

Возвращенный DTO:

 public class CustomerProductDTO {
    
    int vendorproductid;
    String name;
    float price;
    int quantity;
    String image;    
    int stockQuantity;    
    boolean isOutOfStock;

        public CustomerProductDTO() {}
        public CustomerProductDTO(int vendorproductid, String name, float price, int quantity, String image) {
        super();
        this.vendorproductid = vendorproductid;
        this.name = name;
        this.price = price;
        this.quantity = quantity;
        this.image = image;
    }

    //getter and setter
}
  

Комментарии:

1. Какой именно запрос вы пытаетесь вызвать (каковы значения параметров)? Кстати float , это не совсем тип данных, подходящий для хранения денежных значений. Я бы настоятельно рекомендовал BigDecimal вместо этого переключиться на

2. Я уже упомянул все, о чем идет речь. Хорошо, спасибо за совет.

3. не могли бы вы добавить классы сущностей?

Ответ №1:

В вашем контроллере над строкой,

 customerProductDTOs = vendorProductRepo.getProductsLowToHigh(vendorid, minPrice, maxPrice, p)
  

Добавьте приведенный ниже код, чтобы эта аннотация помогла вам отсортировать полученные записи в порядке возрастания или убывания, а также указать точное поле, которое вы хотите отсортировать.

 @ElementCollection
@OrderBy("position.code DESC")