复杂查询的实践

2017-12-11  本文已影响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;
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读