英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论