美文网首页
复杂查询的实践

复杂查询的实践

作者: 焱魔王 | 来源:发表于2017-12-11 14:02 被阅读0次

    原创 时间:2017/12/11

    查询条件定义

    @Data
    public class AppConditionRequest {
        int index;
        int size;
        /**
         * 应用名称搜索关键字
         */
        String appNameKey;
        /**
         * 系统架构id
         */
        String sysarchitectureid;
        /**
         * 软件来源id
         */
        String sourceid;
        /**
         * 软件注册时间范围--起点
         */
        long startTime;
        /**
         * 软件注册时间范围--终点
         */
        long endTime;
        /**
         * 应用所属部门id
         */
        String deptId;
    }
    

    注:此处使用lombok的@Data标签省略了get/set方法。

    自定义多条件查询

       /**
         * 根据条件检索应用
         * @param appNameKey app名称模糊查询关键字
         * @param sysarchitectureid 系统架构id
         * @param sourceid 软件来源id
         * @param startTime 系统启用时间范围检索--起点时间
         * @param endTime 系统启用时间范围检索--终点时间
         * @param deptId 应用所属部门
         * @return
         */
    
        public static Specification<AppVo> getAppByCondition(String appNameKey,
                                                             String sysarchitectureid,
                                                             String sourceid,
                                                             long startTime,
                                                             long endTime,
                                                             String deptId){
            return new Specification<AppVo>() {
                @Override
                public Predicate toPredicate(Root<AppVo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
                    List<Predicate> predicates = new ArrayList<>();
                    if(!"".equals(appNameKey)&&appNameKey!=null){
                        predicates.add(builder.like(root.get("name"),"%"+appNameKey+"%"));
                    }
                    if(!"".equals(sourceid)&&sourceid!=null){
                        predicates.add(builder.equal(root.get("sourceid"),sourceid));
                    }
                    if(!"".equals(sysarchitectureid)&&sysarchitectureid!=null){
                        predicates.add(builder.equal(root.get("sysarchitectureid"),sysarchitectureid));
                    }
                    if(!"".equals(deptId)&&deptId!=null){
                        predicates.add(builder.equal(root.get("deptid"),deptId));
                    }
                    if(startTime!=0&&endTime!=0){
                        if(endTime>=startTime) {
                            predicates.add(builder.between(root.get("registdate"), startTime,endTime));
                        }else{
                            log.error("-------------->end time less than start time!");
                            return null;
                        }
                    }
                    return builder.and(predicates.toArray(new Predicate[predicates.size()]));
                }
            };
        }
    

    自定义多条件查询类使用

     /**
         * 根据条件查询应用(名称关键字、系统架构、软件来源、时间范围、部门id)
         * @param conditions
         * @return
         */
    
        public Object getAppByConditions(AppConditionRequest conditions){
            Page<AppVo> ResultList = null;
            //分页
            if(conditions.getIndex()!=0||conditions.getSize()!=0) {
                Sort sort = new Sort(Sort.Direction.DESC,"registdate");
                PageRequest pageRequest = new PageRequest(conditions.getIndex(), conditions.getSize(),sort);
                ResultList = this.repo.findAll(CustomerSpecs.getAppByCondition(conditions.getAppNameKey(),
                        conditions.getSysarchitectureid(),
                        conditions.getSourceid(),
                        conditions.getStartTime(),
                        conditions.getEndTime(),
                        conditions.getDeptId()), pageRequest);
            }
            if (ResultList!=null&&ResultList.getSize()>0) {
                List<AppResponse> vos = new ArrayList<>();
                ResultList.forEach(vo -> {
                    try {
                        vos.add(new AppResponse(vo));
                    } catch (Exception e) {
                    }
                });
                return ResultFormat.getResult(vos,conditions.getIndex(),conditions.getSize(),(int)ResultList.getTotalElements());
            } else {
                log.info("---------------cannot find apps!");
                return null;
            }
        }
    

    相关文章

      网友评论

          本文标题:复杂查询的实践

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