JPA Criteria Query

There is such a simple requirement one day, a page has N kinds of query methods, these N kinds of parameters may or may not,

The other A type of query is "AND", and the rest is "OR".

1.png

There is such a simple requirement one day, a page has N kinds of query methods, these N kinds of parameters may or may not,

and

·Just query some of the fields (the table and the table are related)
·Paging is required
·To query the statistics after pagination (simple, you can find out the calculation after pagination)
·To query the statistics of all data before pagination (This……)

2.png

One day there is such a simple demand, a page has N kinds of query methods, these N kinds of parameters may or may not,

and

·Just query some of the fields (the table and the table are related)
·Paging is required
·To query the statistics after pagination (simple, you can find out the calculation after pagination)
·To query the statistics of all data before pagination (This...)
·Some of the fields and conditions that need to be queried are in an unrelated third-party table... Sometimes the field of this table is filled in with the id of this table, sometimes it is other tables or random strings data.
You cannot directly associate.

Example of 1:

 Page<User>
        userPage = userRepository.findAll(new Specification() {


            @Override
            public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder cb) {
                List<Predicate> predicates = new ArrayList<>();
                List<Predicate> predicatesOr = new ArrayList<>();

                if (departId != null && departId > 0) {
                    Path<Depart> departIdPath = root.get("depart");
                    Depart depart = departRepository.findByStoreIdAndIdAndIsDeleted(storeId, departId, BaseDeleteEnums.BASE_DELETE_NO.getCode());
                    if (depart == null) {
                        throw new AppException("查无此部门:" + departId);
                    }

                    predicates.add(cb.equal(departIdPath.as(Depart.class), depart));
                }
                if (postId != null && postId > 0) {
                    Path<Post> postIdPath = root.get("post");
                    Post post = postRepository.findByStoreIdAndIdAndIsDeleted(storeId, postId, BaseDeleteEnums.BASE_DELETE_NO.getCode());
                    if (post == null) {
                        throw new AppException("查无此职位:" + postId);
                    }

                    predicates.add(cb.equal(postIdPath.as(Post.class), post));
                }
                if (cardGradeId != null && cardGradeId > 0) {

                    DebugPrint.i("cardGradeId", cardGradeId + "");
                    Path<Card> cardPath = root.get("card");
                    CardGrade cardGrade = cardGradeRepository.findByStoreIdAndIdAndIsDeleted(storeId, cardGradeId, BaseDeleteEnums.BASE_DELETE_NO.getCode());

                    if (cardGrade == null) {
                        throw new AppException("查无此卡级别:" + cardGradeId);
                    }
                    List<Card> cardList = cardRepository.findByStoreIdAndCardGradeAndIsDeleted(storeId, cardGrade, BaseDeleteEnums.BASE_DELETE_NO.getCode());
                    if (cardList != null && cardList.size() > 0) {
                        CriteriaBuilder.In<Card> in = cb.in(cardPath);
                        for (int i = 0; i < cardList.size(); i++) {
                            in.value(cardList.get(i));
                        }


                        predicates.add(in);
                    } else {

                        predicates.add(cb.equal(root.get("id").as(Integer.class), -1));
                    }

                }
                if (cardStatus != null) {

                    DebugPrint.i("cardStatus", cardStatus + "");
                    Path<Card> cardPath = root.get("card");

                    List<Card> cardList = cardRepository.findByStoreIdAndCardStatusAndIsDeleted(storeId, cardStatus, BaseDeleteEnums.BASE_DELETE_NO.getCode());
                    if (cardList != null && cardList.size() > 0) {
                        CriteriaBuilder.In<Card> in = cb.in(cardPath);
                        for (int i = 0; i < cardList.size(); i++) {
                            in.value(cardList.get(i));
                        }


                        predicates.add(in);

                    } else {
                        predicates.add(cb.equal(root.get("id").as(Integer.class), -1));
                    }

                }
                if (provinceId != null) {
                    DebugPrint.i("provinceId", provinceId + "");
                    Path<Integer> provinceIdPath = root.get("provinceId");
                    predicates.add(cb.equal(provinceIdPath.as(Integer.class), provinceId));
                }
                if (cityId != null) {
                    Path<Integer> provinceIdPath = root.get("cityId");
                    predicates.add(cb.equal(provinceIdPath.as(Integer.class), cityId));
                }

                if (balance != null && flag != null && !flag.isEmpty()) {
                    Path<BigDecimal> provinceIdPath = root.get("balance");

                    if (flag.equals("大于")) {
                        predicates.add(cb.ge(provinceIdPath.as(BigDecimal.class), balance));

                    } else if (flag.equals("等于")) {
                        predicates.add(cb.equal(provinceIdPath.as(BigDecimal.class), balance));

                    } else if (flag.equals("小于")) {
                        predicates.add(cb.le(provinceIdPath.as(BigDecimal.class), balance));

                    } else {
                        throw new AppException("flag错误,应为 大于、等于或小于,而非:" + flag);
                    }

                }

                if (keyword != null && !keyword.isEmpty()) {
                    Path<String> realNamePath = root.get("realName");
                    Path<String> mobilePath = root.get("mobile");
                    Path<String> identityPath = root.get("identity");
                    Path<String> idcardPath = root.get("idcard");
                    predicatesOr.add(cb.like(realNamePath.as(String.class), "%" + keyword + "%"));
                    predicatesOr.add(cb.like(mobilePath.as(String.class), "%" + keyword + "%"));
                    predicatesOr.add(cb.like(identityPath.as(String.class), "%" + keyword + "%"));
                    predicatesOr.add(cb.like(idcardPath.as(String.class), "%" + keyword + "%"));
                    Path<Card> cardPath = root.get("card");
                    List<Card> cardList = cardRepository.findByStoreIdAndSnAndIsDeleted(storeId, keyword, BaseDeleteEnums.BASE_DELETE_NO.getCode());
                    if (cardList != null && cardList.size() > 0) {
                        CriteriaBuilder.In<Card> in = cb.in(cardPath);
                        for (int i = 0; i < cardList.size(); i++) {
                            in.value(cardList.get(i));
                        }
                        predicatesOr.add(in);
                    }


                }
                if (cardsn != null && !cardsn.isEmpty()) {
                    DebugPrint.i("sn", cardsn + "");
                    Path<Card> cardPath = root.get("card");

                    List<Card> cardList = cardRepository.findByStoreIdAndSnAndIsDeleted(storeId, cardsn, BaseDeleteEnums.BASE_DELETE_NO.getCode());
                    if (cardList != null && cardList.size() > 0) {
                        CriteriaBuilder.In<Card> in = cb.in(cardPath);
                        for (int i = 0; i < cardList.size(); i++) {
                            in.value(cardList.get(i));
                        }


                        predicates.add(in);

                    } else {
                        predicates.add(cb.equal(root.get("id").as(Integer.class), -1));
                    }


                }

                Predicate[] pre = new Predicate[predicates.size()];
                criteriaQuery.where(predicates.toArray(pre)).where();

                Predicate predicatesWhere = cb.and(predicates.toArray(pre));

                if (predicatesOr.size() > 0) {
                    Predicate[] preOr = new Predicate[predicatesOr.size()];
                    criteriaQuery.where(predicatesOr.toArray(preOr)).where();
                    Predicate predicatesWhereOr = cb.or(predicatesOr.toArray(preOr));
                    return criteriaQuery.where(predicatesWhere, predicatesWhereOr).getRestriction();
                }


                return cb.and(predicates.toArray(pre));
            }
        }, pageable);

2 example

   @PersistenceContext
    private EntityManager em;



Map<String, Object> resultMap = new HashMap<>();
        Integer storeId = params.containsKey("storeId") ? Integer.parseInt(params.get("storeId").toString()) : 0;
        //增减原因 资金变动类型:1-充值、2-发放补贴、3-现金取款、4-补贴取款……
        Integer type = params.containsKey("type") ? Integer.parseInt(params.get("type").toString()) : 0;
        Integer managerId = params.containsKey("managerId") ? Integer.parseInt(params.get("managerId").toString()) : 0;
        Integer departId = params.containsKey("departId") ? Integer.parseInt(params.get("departId").toString()) : 0;
        Date beginTime = params.containsKey("beginTime") ? DateUtils.String2Date(params.get("beginTime").toString(), "yyyy-MM-dd HH:mm:ss") : null;
        Date endTime = params.containsKey("endTime") ? DateUtils.String2Date(params.get("endTime").toString(), "yyyy-MM-dd HH:mm:ss") : null;
        String realName = params.containsKey("realName") ? params.get("realName").toString() : null;
        String identity = params.containsKey("identity") ? params.get("identity").toString() : null;


//定义查询字段与别名
        String alia_id = "id";
        String alia_realName = "realName";
        String alia_identity = "identity";
        String alia_departTitle = "departTitle";
        String alia_changeBalance = "changeBalance";
        String alia_changeSubsidy = "changeSubsidy";
        String alia_changeDonation = "changeDonation";
        String alia_balance = "balance";
        String alia_subsidy = "subsidy";
        String alia_donation = "donation";
        String alia_cardSn = "cardSn";
        String alia_type = "type";
        String alia_referer = "referer";
        String alia_managerName = "managerName";
        String alia_createTime = "createTime";

        String alia_total = "total";
        String alia_sumChangeBalance = "sumChangeBalance";
        String alia_sumChangeSubsidy = "sumChangeSubsidy";
        String alia_sumChangeDonation = "sumChangeDonation";


        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Tuple> criteriaQuery = cb.createTupleQuery();//列表查询
        CriteriaQuery<Tuple> criteriaQueryCount = cb.createTupleQuery();//统计查询
        Root<LogCardCapital> root = criteriaQuery.from(LogCardCapital.class);
        Root<LogCardCapital> rootCount = criteriaQueryCount.from(LogCardCapital.class);


        criteriaQuery.multiselect(

                root.get("id").alias(alia_id),
                root.get("user").get("realName").alias(alia_realName),
                root.get("user").get("identity").alias(alia_identity),
                root.get("user").get("depart").get("title").alias(alia_departTitle),
                root.get("user").get("card").get("sn").alias(alia_cardSn),
                root.get("referer").alias(alia_referer),
                root.get("type").alias(alia_type),
                root.get("managerName").alias(alia_managerName),
                root.get("createTime").alias(alia_createTime),
                root.get("changeBalance").alias(alia_changeBalance),
                root.get("changeSubsidy").alias(alia_changeSubsidy),
                root.get("changeDonation").alias(alia_changeDonation),
                root.get("balance").alias(alia_balance),
                root.get("subsidy").alias(alia_subsidy),
                root.get("donation").alias(alia_donation)

        );
        criteriaQueryCount.multiselect(
                cb.count(rootCount.get("id")).alias(alia_total),
                cb.sum(rootCount.get("changeBalance")).alias(alia_sumChangeBalance),
                cb.sum(rootCount.get("changeDonation")).alias(alia_sumChangeSubsidy),
                cb.sum(rootCount.get("changeDonation")).alias(alia_sumChangeDonation)

        );


        List<Predicate> predicates = new ArrayList<>();

        if (storeId != null && storeId > 0) {

            Path<Integer> storeIdPath = root.get("storeId");
            predicates.add(cb.equal(storeIdPath.as(Integer.class), storeId));

        }
        //增减原因
        if (type != null && type > 0) {
            Path<Integer> typePath = root.get("type");
            predicates.add(cb.equal(typePath.as(Integer.class), type));

        }
        if (managerId != null && managerId > 0) {
            Path<Integer> managerIdPath = root.get("managerId");
            predicates.add(cb.equal(managerIdPath.as(Integer.class), managerId));

        }
        if (beginTime != null) {
            Path<Date> createTimePath = root.get("createTime");
            predicates.add(cb.greaterThanOrEqualTo(createTimePath.as(Date.class), beginTime));

        }
        if (endTime != null) {
            Path<Date> createTimePath = root.get("createTime");
            predicates.add(cb.lessThanOrEqualTo(createTimePath.as(Date.class), endTime));

        }
        if (departId != null && departId > 0) {
            Path<User> userPath = root.get("user");
            Path<Depart> departPath = userPath.get("depart");
            Depart depart = departRepository.findByStoreIdAndIdAndIsDeleted(storeId, departId, BaseDeleteEnums.BASE_DELETE_NO.getCode());
            if (depart == null) {
                throw new AppException("查无此部门:" + departId);
            }
            predicates.add(cb.equal(departPath.as(Depart.class), depart));

        }
        if (realName != null && !realName.isEmpty()) {
            Path<User> userPath = root.get("user");
            Path<String> realNamePath = userPath.get("realName");
            predicates.add(cb.equal(realNamePath.as(String.class), realName));
        }
        if (identity != null && !identity.isEmpty()) {
            Path<User> userPath = root.get("user");
            Path<String> identityPath = userPath.get("identity");
            predicates.add(cb.equal(identityPath.as(String.class), identity));
        }

        criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()]));
        criteriaQueryCount.where(predicates.toArray(new Predicate[predicates.size()]));

        TypedQuery query = em.createQuery(criteriaQuery);
        //int totalRows = query.getResultList().size();
        query.setFirstResult(pageNum * pageSize);
        query.setMaxResults(pageSize);
        List<Tuple> list = query.getResultList();


        List<Map<String, Object>> dataList = new ArrayList<>();
        if (list != null && !list.isEmpty()) {

            for (Tuple tu : list
                    ) {
                Map<String, Object> itemmap = new HashMap<>();
                for (TupleElement element : tu.getElements()) {
                    if (element.getAlias().toString().equalsIgnoreCase(alia_type)) {

                        try {
                            itemmap.put(alia_type + "Title", EnumsUtil.getEnumObject(Integer.parseInt(tu.get(element.getAlias()).toString()),
                                    CardCapitalTypeEnums.class).getMsg());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else if (element.getAlias().toString().equalsIgnoreCase(alia_referer)) {
                        try {
                            itemmap.put(alia_referer + "Title", EnumsUtil.getEnumObject(Integer.parseInt(tu.get(element.getAlias()).toString()),
                                    RefererEnums.class).getMsg());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    itemmap.put(element.getAlias(), tu.get(element.getAlias()));

                }
                dataList.add(itemmap);
            }


        }
        resultMap.put("list", dataList);
        resultMap.put("page", pageNum);
        resultMap.put("pageSize", pageSize);
        resultMap.put("number", dataList.size());
        TypedQuery queryCount = em.createQuery(criteriaQueryCount);
        List<Tuple> listcount = queryCount.getResultList();
        if (listcount != null && !listcount.isEmpty()) {

            Tuple tu = listcount.get(0);
            for (TupleElement element : tu.getElements()) {
                resultMap.put(element.getAlias(), tu.get(element.getAlias()));

            }
        }

3. For details, see: https://www.jianshu.com/p/6156bf21374c
 

Guess you like

Origin blog.csdn.net/My_SweetXue/article/details/114090845
Recommended