Sắp xếp không hoạt động chính xác! Java SORT
Tôi đang viết MVC Restcửa hàng trực tuyến. Tôi sử dụng Spring Boot, Hibernatevà PostgreSQLtrong dự án của tôi. Tôi có đồ uống và muốn có thể phân loại chúng khi tôi nhận được chúng. Theo tên và giá cả, mọi thứ đều tốt, nhưng tôi không thể sắp xếp theo mức độ phổ biến. Đối với điều này tôi sử dụng Paginationvà Sort. Trong lớp đồ uống, tôi sử dụng ordersCountbiến mà tôi đã đánh dấu bằng @Formulachú thích và viết sql-query. Bản thân yêu cầu phải lấy đồ uống từ giỏ hàng IDvà trả lại số lượng của nó. Riêng biệt, tôi đã kiểm tra yêu cầu trong cơ sở dữ liệu và nó hoạt động chính xác. Nhưng khi tôi RESTyêu cầu, tôi nhận được những đồ uống không có trong giỏ chút nào. Điều gì có thể là vấn đề?
ENUM cho loại sắp xếp:
public enum SortingParams {
PRICE_INCREASE, PRICE_DECREASE, NAME_INCREASE, POP_DECREASE
}
Tôi viết phương thức để Sắp xếp:
/*
* @param sortingParams
* @param page
* @param pageSize
* @return PageRequest
*/
public PageRequest sortingWithParams(SortingParams sortingParams, int page, int pageSize) {
switch (sortingParams) {
case PRICE_INCREASE:
return PageRequest.of(page, pageSize, Sort.by("price").ascending());
case PRICE_DECREASE:
return PageRequest.of(page, pageSize, Sort.by("price").descending());
case NAME_INCREASE:
return PageRequest.of(page, pageSize, Sort.by("name").ascending());
case POP_DECREASE:
return PageRequest.of(page, pageSize, Sort.by("ordersCount").descending());
default:
return PageRequest.of(page, pageSize, Sort.unsorted());
}
}
Lớp học uống:
@Data
@Entity
@NoArgsConstructor
@Table(name = "drink")
@Inheritance(strategy = InheritanceType.JOINED)
public class Drink {
@Id
@GeneratedValue
private Long id;
private String name;
private BigDecimal price;
@Formula("(select sum(c.count) from cart_items c where c.drink_id = id)")
private Long ordersCount;
private String about;
private int weight;
@Column(name = "is_deleted")
private boolean isDeleted;
@ManyToOne
@JoinColumn(name = "packaging_id")
private Packaging packaging;
@ManyToOne
@JoinColumn(name = "manufacturer_id")
private Manufacturer manufacturer;
@ManyToOne
@JoinColumn(name = "country_id")
private Country country;
Đây là cách tôi sử dụng phương pháp này sau đó:
public PageDTO<CoffeeDTO> findAll(int page, int pageSize, SortingParams sortingParams) {
final Page<Coffee> coffees = coffeeRepository
.findAll(drinkService.sortingWithParams(sortingParams, page, pageSize));
return new PageDTO<>(coffeeMapper.coffeeToCoffeesDTO(coffees));
}
KẾT QUẢ: http://localhost:8080/coffee/coffees?page=0&page_size=5&sortingParams=POP_DECREASE
{
"totalElements": 9,
"totalPages": 2,
"number": 0,
"size": 5,
"content": [
{
"id": 10,
"name": "Mokka",
"price": 590,
"about": "Mokka - это крепкий и ароматный кофе средней степени обжарки (3 по 5-тибальной шкале Paulig).",
"weight": 800,
"packaging": {
"id": 1,
"name": "Вакуумная упаковка"
},
"manufacturer": {
"id": 4,
"name": "Nescafe"
},
"country": {
"id": 7,
"name": "Франция"
},
"coffeeType": null,
"roasting": null
},
{
"id": 11,
"name": "Бурбон",
"price": 320,
"about": "Бурбон - свое название сорт получил в честь географической родины – французского острова Бурбон (ныне Реюньон). Именно здесь в начале XVIII века прижились первые саженцы кофейных деревьев, вывезенных из Йемена.",
"weight": 400,
"packaging": {
"id": 5,
"name": "Жестяная банка"
},
"manufacturer": {
"id": 5,
"name": "Jacobs"
},
"country": {
"id": 8,
"name": "Страна тотемов"
},
"coffeeType": null,
"roasting": null
},
{
"id": 13,
"name": "Жокей",
"price": 1199,
"about": "Жокей - насыщенный, крепкий, ароматный, с пряными нотками Жокей Для турки создан искусным сочетанием лучших сортов кофе из Центральной и Южной Америки, Африки и Индии. Особо мелкий помол идеален для приготовления кофе в турке.",
"weight": 850,
"packaging": {
"id": 4,
"name": "Стеклаянная банка"
},
"manufacturer": {
"id": 4,
"name": "Nescafe"
},
"country": {
"id": 2,
"name": "Индия"
},
"coffeeType": null,
"roasting": null
},
{
"id": 14,
"name": "Oro",
"price": 790,
"about": "Ароматный напиток Oro, созданный для требовательного кофемана с утонченным вкусом. Тщательно подобранный купаж создан из 100 % высокогорной арабики, выращенной на лучших плантациях Центральной Америки. Средняя обжарка и высокое качество сырья позволяют получить ярко выраженный красочный вкус и запоминающийся аромат, наполненный выразительной цветочной нотой с небольшой горчинкой.",
"weight": 750,
"packaging": {
"id": 1,
"name": "Vacuum"
},
"manufacturer": {
"id": 5,
"name": "Jacobs"
},
"country": {
"id": 3,
"name": "China"
},
"coffeeType": null,
"roasting": null
},
{
"id": 9,
"name": "Prince",
"price": 730,
"about": "srfrfrftring",
"weight": 0,
"packaging": {
"id": 1,
"name": "Vacuum"
},
"manufacturer": {
"id": 5,
"name": "Jacobs"
},
"country": {
"id": 2,
"name": "India"
},
"coffeeType": null,
"roasting": null
}
]
}
Trả lời
Tôi thực hiện lại @Formulatruy vấn và nó hoạt động:
@Formula("coalesce((select sum(c.count) from cart_items c" +
" where c.drink_id = id), 0)")
Tôi thêm coalesce()từ PostgreSQL.