如果给出了@RequestParameter,则按它的值进行过滤,如果没有则什么都不做
If @RequestParameter is given, filter by it's value, if not do nothing
我正在尝试使用@RequestParam,如果给定了值,它应该过滤掉通过该参数在数据库中找到的所有项目,否则它什么都不做。我也想问问这里函数式编程好用吗
这是我的车class:
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;
import javax.persistence.*;
@Data
@Entity
@Table(name = "Cars")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Setter(AccessLevel.NONE)
private Long Id;
private int yearOfProduction;
private int price;
private String color;
private String brand;
private String model;
@ManyToOne
@JoinColumn(name = "customer")
private Customer customer;
public Car() {
}
public Car(int yearOfProduction, int price, String color, String brand, String model) {
this.yearOfProduction = yearOfProduction;
this.price = price;
this.color = color;
this.brand = brand;
this.model = model;
}
}
这是我设置参数要求的控制器:
@GetMapping
public List<Car> getCars(@RequestParam(required = false) Integer minPrice,
@RequestParam(required = false) Integer maxPrice,
@RequestParam(required = false) String model){
return carService.getCars(minPrice, maxPrice, model);
}
这是汽车服务,我想做的是:
public List<Car> getCars(Integer minPrice, Integer maxPrice, String model) {
return carRepository
.findAll()
.stream()
.filter(car ->
//if minPrice exists
car.getPrice() >= minPrice
&&
//if maxPrice exists
car.getPrice() <= maxPrice
&&
//if model exists
car.getModel().equals(model))
.collect(Collectors.toList());
}
我可以在控制器中设置 @RequestParam (defaultValue = "something")
,但这是有问题的,因为我不知道“型号”字段的默认值是多少,因为每辆汽车都有不同的型号,但我仍然必须过滤默认值的项目,不需要它,因为如果没有给出,我不想用它做任何事情。
我也试图将 Optional<>
作为参数传递,然后在过滤器函数中使用 if 语句和 ifPresent() 方法检查每个参数,但我不知道如何将它们组合在一起。
您可以像这样创建一个 jpa 查询(在您的汽车存储库中):
@Query("select c from Car c where (?1 is null or c.price >= ?1) and (?2 is null or c.price <= ?2) and (?3 is null or c.model = ?3)")
List<Car> getCars(Integer minPrice, Integer maxPrice, String model);
然后从您的 CarService
:
调用它
public List<Car> getCars(Integer minPrice, Integer maxPrice, String model) {
return carRepository.getCars(minPrice, maxPrice, model);
}
在 postgresql 中规避转换问题的一种方法是使用参数的默认值。假设您将 0 设置为最低价格和最高价格的默认值,并将模型设置为空字符串。
@Query("select c from Car c where (?1 = 0 or c.price >= ?1) and (?2 = 0 or c.price <= ?2) and (?3 = '' or c.model = ?3)")
List<Car> getCars(Integer minPrice, Integer maxPrice, String model);
在你的控制器中:
@RequestParam(defaultValue="") String model
@RequestParam(defaultValue="0") Integer minPrice
@RequestParam(defaultValue="0") Integer maxPrice
我正在尝试使用@RequestParam,如果给定了值,它应该过滤掉通过该参数在数据库中找到的所有项目,否则它什么都不做。我也想问问这里函数式编程好用吗
这是我的车class:
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;
import javax.persistence.*;
@Data
@Entity
@Table(name = "Cars")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Setter(AccessLevel.NONE)
private Long Id;
private int yearOfProduction;
private int price;
private String color;
private String brand;
private String model;
@ManyToOne
@JoinColumn(name = "customer")
private Customer customer;
public Car() {
}
public Car(int yearOfProduction, int price, String color, String brand, String model) {
this.yearOfProduction = yearOfProduction;
this.price = price;
this.color = color;
this.brand = brand;
this.model = model;
}
}
这是我设置参数要求的控制器:
@GetMapping
public List<Car> getCars(@RequestParam(required = false) Integer minPrice,
@RequestParam(required = false) Integer maxPrice,
@RequestParam(required = false) String model){
return carService.getCars(minPrice, maxPrice, model);
}
这是汽车服务,我想做的是:
public List<Car> getCars(Integer minPrice, Integer maxPrice, String model) {
return carRepository
.findAll()
.stream()
.filter(car ->
//if minPrice exists
car.getPrice() >= minPrice
&&
//if maxPrice exists
car.getPrice() <= maxPrice
&&
//if model exists
car.getModel().equals(model))
.collect(Collectors.toList());
}
我可以在控制器中设置 @RequestParam (defaultValue = "something")
,但这是有问题的,因为我不知道“型号”字段的默认值是多少,因为每辆汽车都有不同的型号,但我仍然必须过滤默认值的项目,不需要它,因为如果没有给出,我不想用它做任何事情。
我也试图将 Optional<>
作为参数传递,然后在过滤器函数中使用 if 语句和 ifPresent() 方法检查每个参数,但我不知道如何将它们组合在一起。
您可以像这样创建一个 jpa 查询(在您的汽车存储库中):
@Query("select c from Car c where (?1 is null or c.price >= ?1) and (?2 is null or c.price <= ?2) and (?3 is null or c.model = ?3)")
List<Car> getCars(Integer minPrice, Integer maxPrice, String model);
然后从您的 CarService
:
public List<Car> getCars(Integer minPrice, Integer maxPrice, String model) {
return carRepository.getCars(minPrice, maxPrice, model);
}
在 postgresql 中规避转换问题的一种方法是使用参数的默认值。假设您将 0 设置为最低价格和最高价格的默认值,并将模型设置为空字符串。
@Query("select c from Car c where (?1 = 0 or c.price >= ?1) and (?2 = 0 or c.price <= ?2) and (?3 = '' or c.model = ?3)")
List<Car> getCars(Integer minPrice, Integer maxPrice, String model);
在你的控制器中:
@RequestParam(defaultValue="") String model
@RequestParam(defaultValue="0") Integer minPrice
@RequestParam(defaultValue="0") Integer maxPrice