jpa 动态分页查询示范

jpa 动态分页查询示例
动态拼接查询条件
    private Specification<InfoPushBasic> getWhereClause(final InfoPushSearch infoPushBasicSearch){
        return new Specification<InfoPushBasic>() {
            @Override
            public Predicate toPredicate(Root<InfoPushBasic> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                root = query.from(InfoPushBasic.class);
 
                List<Predicate> predicate = new ArrayList<>();
                String infoType = infoPushBasicSearch.getInfoType();
                String pushWay = infoPushBasicSearch.getPushWay();
 
                predicate.add(cb.equal(root.get("createrId"), infoPushBasicSearch.getUserId()));
                 
                if(infoType!=null){
                    In<Object> in = cb.in(root.get("infoTypeCode"));
                    String[] infoTypeArray = infoType.split(",");
                    for (Serializable infoTypeCode : infoTypeArray) {
                        in.value(infoTypeCode);
                    }
                    predicate.add(in);
 
                }
                if(pushWay!=null){
                    Join<InfoPushBasic,PushWayBasic> pushWayJoin = root.join(root.getModel().getSingularAttribute("pushWayBasic",PushWayBasic.class),JoinType.LEFT);
                    String[] pushWayArray = pushWay.split(",");
                    Predicate orPre = cb.equal(root.get("createrId"), "createrId");
                    for (String pushWayCode : pushWayArray) {
                        orPre = cb.or(orPre, cb.like(pushWayJoin.get("pushWayCode").as(String.class),"%" + pushWayCode + "%"));
                    }                    
                    predicate.add(orPre);
                }
                if (infoPushBasicSearch.getChannelState()!=null){
                    predicate.add(cb.equal(root.get("channelState").as(String.class), infoPushBasicSearch.getChannelState()));
                }
                if(infoPushBasicSearch.getPushPeriodBegin()!=null){
                    predicate.add(cb.greaterThanOrEqualTo(root.get("pushPeriodBegin").as(Date.class), infoPushBasicSearch.getPushPeriodBegin()));
                }
                if(infoPushBasicSearch.getPushPeriodEnd()!=null){
                    predicate.add(cb.lessThanOrEqualTo(root.get("pushPeriodEnd").as(Date.class), infoPushBasicSearch.getPushPeriodEnd()));
                }
                 
                Predicate[] pre = new Predicate[predicate.size()];
                return query.where(predicate.toArray(pre)).getRestriction();
            }
 
        };
        }