如何在规范方法中使用多个参数过滤对象?
How to filter an object using multiple parameters in the specification method?
我正在使用 Spring-Boot
(MVC
)和 Hiberbate
编写在线商店。我决定使用 Jpa specification
来过滤对象列表。例如,使用参数 roast 和 type 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
基于 mobile
和 pincode
过滤区域,并使用以下代码实现相同的效果
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()
运算符。
我正在使用 Spring-Boot
(MVC
)和 Hiberbate
编写在线商店。我决定使用 Jpa specification
来过滤对象列表。例如,使用参数 roast 和 type 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
基于 mobile
和 pincode
过滤区域,并使用以下代码实现相同的效果
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()
运算符。