如何在规范方法中使用多个参数过滤对象?

How to filter an object using multiple parameters in the specification method?

我正在使用 Spring-BootMVC)和 Hiberbate 编写在线商店。我决定使用 Jpa specification 来过滤对象列表。例如,使用参数 roasttype of coffee 过滤 coffee。我完成了所有指南,一切都对我有用,但只有一个输入参数,即烘焙。如何为过滤器添加一个或多个参数,请告诉我...

比如我的实现:

public class CoffeeSpecification {

    public static Specification<Coffee> getCoffeesByRoasting(String name) {
        return (root, query, criteriaBuilder) -> {
            Join<Object, Object> roastingJoin = root.join(Coffee_.ROASTING);
            return criteriaBuilder.equal(roastingJoin.get(Roasting_.NAME), name);
        };
    }}

服务:

public PageDTO<DrinkDTO> findAllFilter(int page, int pageSize, String roastingName, String coffeeType) {

        PageRequest pageRequest = PageRequest.of(page, pageSize, Sort.by("price").ascending());

        final Page<Coffee> coffees = coffeeRepository
                .findAll(CoffeeSpecification.getCoffeesByRoasting(roastingName), pageRequest);

        return new PageDTO<>(drinkMapper.drinksToDrinksDTO(coffees));
    }

控制器:

@GetMapping("/coffees")
    public PageDTO<DrinkDTO> getAllCoffees(@RequestParam(value = "page", defaultValue = "1") int page,
                                           @RequestParam(value = "page_size", defaultValue = "5") int pageSize,
                                           @RequestParam String roastingName) {

        return coffeeService.findAllFilter(page, pageSize, roastingName, coffeeType);
    }

我已经使用 JpaSpecification 基于 mobilepincode 过滤区域,并使用以下代码实现相同的效果

public class UserAreaMappingSpecifications {
    public static Specification<UserAreaMapping> userAreaMappingByFilter(String pinCode, String mobile) {
        return (Specification<UserAreaMapping>) (root, query, cb) -> {
            Predicate pinCodePredicate = Objects.nonNull(pinCode) ? cb.equal(root.get("pinCode"), pinCode) : cb.conjunction();
            Predicate mobilePredicate = Objects.nonNull(mobile) ? cb.equal(root.get("mobile"), mobile) : cb.conjunction();
            return cb.and(pinCodePredicate, mobilePredicate);
        };
    }
}

我使用过谓词并使用 and 运算符组合它们。

可能,您也可以对您的实现进行处理

public class CoffeeSpecification {

    public static Specification<Coffee> getCoffeesByRoasting(String name, String type) {
        return (root, query, criteriaBuilder) -> {
            Join<Object, Object> roastingJoin = root.join(Coffee_.ROASTING);
            Join<Object, Object> typeJoin = root.join(Coffee_.TYPE);
            Predicate rostingPredicate = criteriaBuilder.equal(roastingJoin.get(Roasting_.NAME), name);
            Predicate typePredicate = criteriaBuilder.equal(roastingJoin.get(Roasting_.TYPE), type);
            return cb.and(rostingPredicate, typePredicate);

        };
    }}

希望我能够解决您的问题。

注意: 您可以根据需要使用 or() 运算符,而不是使用 and() 运算符。