JPA使用Java代码进行复杂查询、多重查询

 

Specification<Place> spec = new Specification<Place>() {
            @Override
            public Predicate toPredicate(Root<Place> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                  List<Predicate> predicateList = new ArrayList<>();
                //0.这条数据某个属性等于特定参数值
                    String exam_id = "0";
                    if (!TextUtils.isEmpty(exam_id)) {
                        predicateList.add(criteriaBuilder.equal(root.get("exam_id").as(String.class), exam_id));
                    }
                    //1,模糊查询、某个字段包含特定参数值
                    String place_name = "湖南考点";
                    if (!TextUtils.isEmpty(place_name)) {
                        String pattern = "%" + place_name + "%";
                        predicateList.add(criteriaBuilder.like(root.get("place_name").as(String.class), pattern));//包含 包含条件
                    }
                   
            //某个字段的int值小于某个特定值
            Predicate isCommit = criteriaBuilder.lessThan(root.get("state").as(Integer.class), 100);
            //某个字段被包含于某个数组或集合中
            String [] placeIds = {"0","1"};
            if (placeIds.size() > 0) {
            Path<String> path = root.get("place_id");//定义查询的字段
            CriteriaBuilder.In<String> in = criteriaBuilder.in(path);
            for (int i = 0; i < placeIds.size(); i++) {
              in.value(placeIds.get(i));//存入值
            }
            predicateList.add(in);
             }
            //判断某个字段是不是为NULL
            if (req.condition.isAssign != BoolState.DEFULT) {
              Path<String> path = root.get("room_id");//定义查询的字段
              if (req.condition.isAssign == BoolState.YES) {
                predicateList.add(criteriaBuilder.isNotNull(path));
              } else {
                predicateList.add(criteriaBuilder.isNull(path));
              }
            }
            //在某个时间段内
            Date toDateFromFromStr = DateUtils.stringToDate(starttime, "yyyy-MM-dd");
            Date toDateEndFromStr = DateUtils.stringToDate(endtime, "yyyy-MM-dd");
            Predicate like2 = criteriaBuilder.between(root.get("showtime").as(Date.class), toDateFromFromStr, toDateEndFromStr);
            predicateList.add(like2 );

            
            Predicate[] pre = new Predicate[predicateList.size()]; 
            pre = predicateList.toArray(pre); 

            return criteriaQuery.where(pre).getRestriction(); }
};

PageRequest pageReques = PageRequest.of(req.curPage=0, req.pageSize=10);//分页查询
Long count = enrollRepository.count(spec);
Page<Place> pages = enrollRepository.findAll(spec, pageReques);//分页、多条件查询
List<Place> enrollList = pages.getContent();

Map map = new LinkedHashMap();
map.put("total", count);
map.put("list", enrollList);
 

 

posted @ 2021-04-13 16:08  野生野鸡码农  阅读(632)  评论(0编辑  收藏  举报