我正在写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
}
我编写了排序方法:
/*
* @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
}
]
}
答案 0 :(得分:0)
我重新制作了@Formula
查询,它的工作原理是:
@Formula("coalesce((select sum(c.count) from cart_items c" +
" where c.drink_id = id), 0)")
我从PostgreSQL添加coalesce()
。