Le tri ne fonctionne pas correctement! Java TRIER
J'écris MVC Restsur une boutique en ligne. J'utilise Spring Boot, Hibernateet PostgreSQLdans mon projet. J'ai des boissons et je veux pouvoir les trier quand je les reçois. Par nom et prix, tout est bon, mais je ne peux pas trier par popularité. Pour cela, j'utilise Paginationet Sort. Dans la classe drink, j'utilise la ordersCountvariable, que j'ai marquée avec l' @Formulaannotation et écrit une sql-query. La demande elle-même doit prendre une boisson dans le chariot IDet retourner sa quantité. Séparément, j'ai vérifié la demande dans la base de données et cela fonctionne correctement. Mais quand je fais une RESTdemande, je reçois ces boissons qui ne sont pas du tout dans le panier. Quel pourrait être le problème?
ENUM pour le type de tri:
public enum SortingParams {
PRICE_INCREASE, PRICE_DECREASE, NAME_INCREASE, POP_DECREASE
}
J'écris la méthode pour le tri:
/*
* @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());
}
}
Classe de boisson:
@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;
Voici comment j'utilise ensuite cette méthode:
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));
}
RÉSULTAT: 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
}
]
}
Réponses
Je refais la @Formularequête et ça marche:
@Formula("coalesce((select sum(c.count) from cart_items c" +
" where c.drink_id = id), 0)")
J'ajoute coalesce()de PostgreSQL.