美文网首页
JPA多条件查询

JPA多条件查询

作者: 木人呆呆 | 来源:发表于2021-04-13 16:13 被阅读0次

    (1)多条件查询实现 对And 和Or的同时处理办法

    直接贴代码

    private Page<MCDemand> specificationQuery(Pageable pageable, String types,Map<String, ?> params){
            Specification<MCDemand> specification = (Specification<MCDemand>) (root, query, cb) -> {
                List<Predicate> list = new ArrayList<>(); // 所有的断言
                for (String key : params.keySet()) {
                    list.add(cb.like(root.get(key).as(String.class), "%" + params.get(key).toString() + "%"));
                }
                Predicate predicateAnd = cb.and(list.toArray(new Predicate[list.size()]));
                List<Predicate> listOr = new ArrayList<>(); // 所有的断言
                List<String> strList = StringUtil.stringToList(types);
                for(String str:strList){
                    listOr.add(cb.like(root.get("type").as(String.class),str));
                }
                Predicate predicateOR = cb.or(listOr.toArray(new Predicate[listOr.size()]));
                return query.where(predicateAnd,predicateOR).getRestriction();
            };
            return mcDemandRepository.findAll(specification, pageable);
    

    使用上面代码块的方法,可以灵活实现复杂的条件查询。

    (2)对于Boolean 值的查询处理办法

        private Page<Satellite> specificationQuery(Pageable pageable, Map<String, ?> params){
            Specification<Satellite> specification = (Specification<Satellite>) (root, query, cb) -> {
                List<Predicate> list = new ArrayList<>(); // 所有的断言
                for (String key : params.keySet()) {
                    if("send".equalsIgnoreCase(key)){
                        if(params.get(key).toString().trim().equalsIgnoreCase("1")){
                            list.add(cb.equal(root.get(key),true));
                        }else if(params.get(key).toString().trim().equalsIgnoreCase("0")){
                            list.add(cb.equal(root.get(key),false));
                        }
                    }else{
                        list.add(cb.like(root.get(key).as(String.class), "%" + params.get(key).toString() + "%"));
                    }
                }
                Predicate[] p = new Predicate[list.size()];
                return cb.and(list.toArray(p));
            };
            return satelliteRepository.findAll(specification, pageable);
        }
    

    其中对于Boolean的处理还是有些机械,需要传入参数 1或者0,进行判断。后续有更优雅的方式,将会补充进来更新。

    相关文章

      网友评论

          本文标题:JPA多条件查询

          本文链接:https://www.haomeiwen.com/subject/bcrclltx.html