排序不正确! Java排序

时间:2020-08-25 12:59:54

标签: java sql postgresql spring-boot hibernate

我正在写MVC Rest在线商店。我在项目中使用Spring BootHibernatePostgreSQL。我有饮料,希望能够在收到饮料时将其分类。按名称和价格,一切都很好,但我无法按受欢迎程度排序。为此,我使用PaginationSort。在饮料类中,我使用ordersCount变量,该变量用@Formula批注标记并编写了一个sql查询。请求本身必须在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
    }
  ]
}

1 个答案:

答案 0 :(得分:0)

我重新制作了@Formula查询,它的工作原理是:

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

我从PostgreSQL添加coalesce()