การเรียงลำดับทำงานไม่ถูกต้อง! Java SORT

Aug 25 2020

ฉันกำลังเขียนMVC Restร้านค้าออนไลน์ ผมใช้Spring Boot, HibernateและPostgreSQLในโครงการของฉัน ฉันมีเครื่องดื่มและต้องการจัดเรียงเมื่อได้รับ ตามชื่อและราคาทุกอย่างดี แต่ฉันไม่สามารถจัดเรียงตามความนิยมได้ สำหรับสิ่งนี้ฉันใช้PaginationและSort. ในคลาสเครื่องดื่มฉันใช้ordersCountตัวแปรซึ่งฉันทำเครื่องหมายด้วย@Formulaคำอธิบายประกอบและเขียน a sql-query คำขอจะต้องนำเครื่องดื่มจากรถเข็นIDและส่งคืนตามปริมาณ แยกกันฉันตรวจสอบคำขอในฐานข้อมูลและทำงานได้อย่างถูกต้อง แต่เมื่อฉันRESTขอฉันได้รับเครื่องดื่มที่ไม่ได้อยู่ในตะกร้าเลย อะไรคือปัญหา?

ENUM สำหรับประเภทการเรียงลำดับ:

public enum SortingParams {

    PRICE_INCREASE, PRICE_DECREASE, NAME_INCREASE, POP_DECREASE
}

ฉันเขียนวิธีการเรียงลำดับ:


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

คลาสเครื่องดื่ม:

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

นี่คือวิธีที่ฉันใช้วิธีนี้:

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

ผลลัพธ์: 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
    }
  ]
}

คำตอบ

ArturVartanyan Aug 26 2020 at 19:59

ฉันสร้าง@Formulaแบบสอบถามใหม่และใช้งานได้:

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

ฉันเพิ่มcoalesce()จาก PostgreSQL