如果给出了@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