Das Sortieren funktioniert nicht richtig! Java SORT

Aug 25 2020

Ich schreibe MVC RestOnline-Shop. Ich verwende Spring Boot, Hibernateund PostgreSQLin meinem Projekt. Ich habe Getränke und möchte sie sortieren können, wenn ich sie erhalte. Nach Name und Preis ist alles gut, aber ich kann nicht nach Beliebtheit sortieren. Dafür benutze ich Paginationund Sort. In der Getränkeklasse verwende ich die ordersCountVariable, die ich mit der @FormulaAnmerkung markiert und eine sqlAbfrage geschrieben habe. Die Anfrage selbst muss ein Getränk aus dem Einkaufswagen nehmen IDund seine Menge zurückgeben. Separat habe ich die Anfrage in der Datenbank überprüft und sie funktioniert korrekt. Aber wenn ich eine RESTAnfrage mache , bekomme ich die Getränke, die überhaupt nicht im Korb sind. Was könnte das Problem sein?

ENUM für Sortiertyp:

public enum SortingParams {

    PRICE_INCREASE, PRICE_DECREASE, NAME_INCREASE, POP_DECREASE
}

Ich schreibe Methode zum Sortieren:


     /*
     * @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());
        }
    }

Getränkeklasse:

@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;

So verwende ich dann diese Methode:

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));
    }

ERGEBNIS: 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
    }
  ]
}

Antworten

ArturVartanyan Aug 26 2020 at 19:59

Ich mache die @FormulaAbfrage neu und es funktioniert:

@Formula("coalesce((select sum(c.count) from cart_items c" +
            " where c.drink_id = id), 0)")

Ich füge coalesce()von PostgreSQL hinzu.