Sorting does not work correctly! Java SORT

huangapple go评论83阅读模式
英文:

Sorting does not work correctly! Java SORT

问题

以下为翻译部分:

我正在编写一个MVC Rest在线商店在我的项目中我使用Spring BootHibernate和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&#39;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(&quot;price&quot;).ascending());

            case PRICE_DECREASE:
                return PageRequest.of(page, pageSize, Sort.by(&quot;price&quot;).descending());

            case NAME_INCREASE:
                return PageRequest.of(page, pageSize, Sort.by(&quot;name&quot;).ascending());

            case POP_DECREASE:
                return PageRequest.of(page, pageSize, Sort.by(&quot;ordersCount&quot;).descending());

            default:
                return PageRequest.of(page, pageSize, Sort.unsorted());
        }
    }

Drink class:

@Data
@Entity
@NoArgsConstructor
@Table(name = &quot;drink&quot;)
@Inheritance(strategy = InheritanceType.JOINED)
public class Drink {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private BigDecimal price;

    @Formula(&quot;(select sum(c.count) from cart_items c where c.drink_id = id)&quot;)
    private Long ordersCount;

    private String about;

    private int weight;

    @Column(name = &quot;is_deleted&quot;)
    private boolean isDeleted;

    @ManyToOne
    @JoinColumn(name = &quot;packaging_id&quot;)
    private Packaging packaging;

    @ManyToOne
    @JoinColumn(name = &quot;manufacturer_id&quot;)
    private Manufacturer manufacturer;

    @ManyToOne
    @JoinColumn(name = &quot;country_id&quot;)
    private Country country;

This is how I then use this method:

public PageDTO&lt;CoffeeDTO&gt; findAll(int page, int pageSize, SortingParams sortingParams) {

        final Page&lt;Coffee&gt; coffees = coffeeRepository
                .findAll(drinkService.sortingWithParams(sortingParams, page, pageSize));

        return new PageDTO&lt;&gt;(coffeeMapper.coffeeToCoffeesDTO(coffees));
    }

RESULT:
http://localhost:8080/coffee/coffees?page=0&amp;page_size=5&amp;sortingParams=POP_DECREASE

{
  &quot;totalElements&quot;: 9,
  &quot;totalPages&quot;: 2,
  &quot;number&quot;: 0,
  &quot;size&quot;: 5,
  &quot;content&quot;: [
    {
      &quot;id&quot;: 10,
      &quot;name&quot;: &quot;Mokka&quot;,
      &quot;price&quot;: 590,
      &quot;about&quot;: &quot;Mokka - это крепкий и ароматный кофе средней степени обжарки (3 по 5-тибальной шкале Paulig).&quot;,
      &quot;weight&quot;: 800,
      &quot;packaging&quot;: {
        &quot;id&quot;: 1,
        &quot;name&quot;: &quot;Вакуумная упаковка&quot;
      },
      &quot;manufacturer&quot;: {
        &quot;id&quot;: 4,
        &quot;name&quot;: &quot;Nescafe&quot;
      },
      &quot;country&quot;: {
        &quot;id&quot;: 7,
        &quot;name&quot;: &quot;Франция&quot;
      },
      &quot;coffeeType&quot;: null,
      &quot;roasting&quot;: null
    },
    {
      &quot;id&quot;: 11,
      &quot;name&quot;: &quot;Бурбон&quot;,
      &quot;price&quot;: 320,
      &quot;about&quot;: &quot;Бурбон - свое название сорт получил в честь географической родины  французского острова Бурбон (ныне Реюньон). Именно здесь в начале XVIII века прижились первые саженцы кофейных деревьев, вывезенных из Йемена.&quot;,
      &quot;weight&quot;: 400,
      &quot;packaging&quot;: {
        &quot;id&quot;: 5,
        &quot;name&quot;: &quot;Жестяная банка&quot;
      },
      &quot;manufacturer&quot;: {
        &quot;id&quot;: 5,
        &quot;name&quot;: &quot;Jacobs&quot;
      },
      &quot;country&quot;: {
        &quot;id&quot;: 8,
        &quot;name&quot;: &quot;Страна тотемов&quot;
      },
      &quot;coffeeType&quot;: null,
      &quot;roasting&quot;: null
    },
    {
      &quot;id&quot;: 13,
      &quot;name&quot;: &quot;Жокей&quot;,
      &quot;price&quot;: 1199,
      &quot;about&quot;: &quot;Жокей - насыщенный, крепкий, ароматный, с пряными нотками Жокей Для турки создан искусным сочетанием лучших сортов кофе из Центральной и Южной Америки, Африки и Индии. Особо мелкий помол идеален для приготовления кофе в турке.&quot;,
      &quot;weight&quot;: 850,
      &quot;packaging&quot;: {
        &quot;id&quot;: 4,
        &quot;name&quot;: &quot;Стеклаянная банка&quot;
      },
      &quot;manufacturer&quot;: {
        &quot;id&quot;: 4,
        &quot;name&quot;: &quot;Nescafe&quot;
      },
      &quot;country&quot;: {
        &quot;id&quot;: 2,
        &quot;name&quot;: &quot;Индия&quot;
      },
      &quot;coffeeType&quot;: null,
      &quot;roasting&quot;: null
    },
    {
      &quot;id&quot;: 14,
      &quot;name&quot;: &quot;Oro&quot;,
      &quot;price&quot;: 790,
      &quot;about&quot;: &quot;Ароматный напиток Oro, созданный для требовательного кофемана с утонченным вкусом. Тщательно подобранный купаж создан из 100 % высокогорной арабики, выращенной на лучших плантациях Центральной Америки. Средняя обжарка и высокое качество сырья позволяют получить ярко выраженный красочный вкус и запоминающийся аромат, наполненный выразительной цветочной нотой с небольшой горчинкой.&quot;,
      &quot;weight&quot;: 750,
      &quot;packaging&quot;: {
        &quot;id&quot;: 1,
        &quot;name&quot;: &quot;Vacuum&quot;
      },
      &quot;manufacturer&quot;: {
        &quot;id&quot;: 5,
        &quot;name&quot;: &quot;Jacobs&quot;
      },
      &quot;country&quot;: {
        &quot;id&quot;: 3,
        &quot;name&quot;: &quot;China&quot;
      },
      &quot;coffeeType&quot;: null,
      &quot;roasting&quot;: null
    },
    {
      &quot;id&quot;: 9,
      &quot;name&quot;: &quot;Prince&quot;,
      &quot;price&quot;: 730,
      &quot;about&quot;: &quot;srfrfrftring&quot;,
      &quot;weight&quot;: 0,
      &quot;packaging&quot;: {
        &quot;id&quot;: 1,
        &quot;name&quot;: &quot;Vacuum&quot;
      },
      &quot;manufacturer&quot;: {
        &quot;id&quot;: 5,
        &quot;name&quot;: &quot;Jacobs&quot;
      },
      &quot;country&quot;: {
        &quot;id&quot;: 2,
        &quot;name&quot;: &quot;India&quot;
      },
      &quot;coffeeType&quot;: null,
      &quot;roasting&quot;: 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(&quot;coalesce((select sum(c.count) from cart_items c&quot; +
            &quot; where c.drink_id = id), 0)&quot;)

I add coalesce() from PostgreSQL.

huangapple
  • 本文由 发表于 2020年8月25日 20:59:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/63579414.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定