JPA多条件查询

(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,进行判断。后续有更优雅的方式,将会补充进来更新。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,620评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,331评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,217评论 2 7