Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在规范方法中使用多个参数过滤对象?_Java_Spring_Hibernate_Spring Data Jpa_Specifications - Fatal编程技术网

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

Java 如何在规范方法中使用多个参数过滤对象?,java,spring,hibernate,spring-data-jpa,specifications,Java,Spring,Hibernate,Spring Data Jpa,Specifications,我正在使用springboot(MVC)和Hiberbate编写一个在线商店。我决定使用Jpa规范来过滤对象列表。例如,使用烘焙参数和咖啡类型过滤咖啡。我做了所有的指导,一切都对我有用,但只有一个输入参数,烘焙。如何为过滤器添加一个或多个参数,请告诉我 例如,我的认识: 公共级咖啡规格{ 公共静态规范GetCoffeesByRosting(字符串名称){ 返回(根、查询、准则生成器)->{ Join-roastingJoin=root.Join(咖啡烘焙); 返回criteriaBuilder.

我正在使用
springboot
MVC
)和
Hiberbate
编写一个在线商店。我决定使用
Jpa规范
来过滤对象列表。例如,使用烘焙参数和咖啡类型过滤咖啡。我做了所有的指导,一切都对我有用,但只有一个输入参数,烘焙。如何为过滤器添加一个或多个参数,请告诉我

例如,我的认识:

公共级咖啡规格{
公共静态规范GetCoffeesByRosting(字符串名称){
返回(根、查询、准则生成器)->{
Join-roastingJoin=root.Join(咖啡烘焙);
返回criteriaBuilder.equal(roastingJoin.get(Roasting.NAME),NAME);
};
}}
服务:

public PageDTO findAllFilter(int-page,int-pageSize,String-broadingname,String-coffeeType){
PageRequest PageRequest=PageRequest.of(页面、页面大小、排序方式(“价格”).ascending());
最后一页咖啡=咖啡储存库
.findAll(咖啡规格.getCoffeesByRoasting(烘焙名称),pageRequest);
返回新的PageDTO(drinkMapper.drinksToDrinksDTO(coffees));
}
控制器:

@GetMapping(“/coffees”)
用于获取所有咖啡的公共页面(@RequestParam(value=“page”,defaultValue=“1”)int page,
@RequestParam(value=“page_size”,defaultValue=“5”)int pageSize,
@RequestParam字符串(名称){
return coffeeService.findAllFilter(页面、页面大小、烘焙名称、咖啡类型);
}

我使用了
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);
        };
    }
}
公共类UserAreaMapping规范{
公共静态规范userAreaMappingByFilter(字符串pinCode、字符串mobile){
返回(规范)(根、查询、cb)->{
谓词pinCodePredicate=Objects.nonNull(pinCode)?cb.equal(root.get(“pinCode”),pinCode):cb.conjunction();
谓词mobileprodicate=Objects.nonNull(mobile)?cb.equal(root.get(“mobile”),mobile):cb.conjunction();
返回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);

        };
    }}
公共级咖啡规格{
公共静态规范GetCoffeesByRosting(字符串名称、字符串类型){
返回(根、查询、准则生成器)->{
Join-roastingJoin=root.Join(咖啡烘焙);
Join-typeJoin=root.Join(Coffee.TYPE);
谓词rostingPredicate=criteriaBuilder.equal(roastingJoin.get(Roasting.NAME),NAME);
谓词类型谓词=criteriaBuilder.equal(roastingJoin.get(Roasting.TYPE),TYPE);
返回cb.and(rostingPredicate,typePredicate);
};
}}
希望我能解决你的问题


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

存储在哪个实体
咖啡
类型中?