#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")