英文:
Sorting does not work correctly! Java SORT
问题
以下为翻译部分:
我正在编写一个MVC Rest在线商店。在我的项目中,我使用Spring Boot、Hibernate和PostgreSQL。我有饮料,并希望在收到它们时能够对它们进行排序。按名称和价格排序都没有问题,但是我无法按受欢迎程度排序。为此,我使用了分页(Pagination)和排序(Sort)。在饮料类中,我使用了`ordersCount`变量,我用`@Formula`注解标记了它,并编写了一个SQL查询。请求本身必须根据ID从购物车中取出饮料,并返回其数量。我已经单独在数据库中检查了请求,它可以正常工作。但是当我发出REST请求时,我得到的是根本不在购物篮中的那些饮料。问题可能是什么?
排序类型的枚举(ENUM):
public enum SortingParams {
PRICE_INCREASE, PRICE_DECREASE, NAME_INCREASE, POP_DECREASE
}
我编写了一个用于排序的方法:
```java
    /*
     * @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 % вы
<details>
<summary>英文:</summary>
I am writing `MVC` `Rest` online store. I use `Spring Boot`, `Hibernate` and `PostgreSQL` in my project. I have drinks and want to be able to sort them when I receive them. By name and price, everything is good, but I can't sort by popularity. For this I use `Pagination` and `Sort`. In the drink class, I use the `ordersCount` variable, which I marked with the `@Formula` annotation and wrote a `sql`-query. The request itself must take a drink from the cart by `ID` and return its quantity. Separately, I checked the request in the database, and it works correctly. But when I make a `REST` request, I get those drinks that are not in the basket at all. What could be the problem?
ENUM for Sorting type:
```java
public enum SortingParams {
    PRICE_INCREASE, PRICE_DECREASE, NAME_INCREASE, POP_DECREASE
}
I write method for Sorting:
     /*
     * @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());
        }
    }
Drink class:
@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;
This is how I then use this method:
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));
    }
RESULT:
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
我重新制作了 @Formula 查询,并且它起作用:
@Formula("coalesce((select sum(c.count) from cart_items c" +
            " where c.drink_id = id), 0)")
我添加了来自 PostgreSQL 的 coalesce()。
英文:
I remake @Formula query and it works:
@Formula("coalesce((select sum(c.count) from cart_items c" +
            " where c.drink_id = id), 0)")
I add coalesce() from PostgreSQL.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论