0
点赞
收藏
分享

微信扫一扫

重构一段分页不分页且关联查询的代码

惠特曼 2023-05-12 阅读 85

接受一个旧项目代码如下:

//处理关联的关系:

   List<Relation> relations = Optional.ofNullable(entity.getRelations()).orElse(new ArrayList<>());

   for (int i = 0; i < relations.size(); i++) {

     Relation tempRel = relations.get(i);

     if (ConnectionType.hasOne.toString().equalsIgnoreCase(tempRel.getType().toString())) {

       for (int m = 0; m < list.size(); m++) {

         Object d = list.get(m);

         //获取关联类型

         RelationType relationType = tempRel.getRelationType();

         //获取关联字段的属性值

         Object xxxData_id = ReflectUtil.getFieldValue(d, relationType.getDesc());

         if (xxxData_id != null) {

           String s = xxxData_id.toString();

           BasePo byId = commonUtil.getModel(tempRel.getModel()).getBaseService().findById(s);

           ReflectUtil.setFieldValue(d, ReflectUtil.getField(d.getClass(), tempRel.getFieldName()), byId);

         }

       }

     } else if (ConnectionType.hasMany.toString().equalsIgnoreCase(tempRel.getType().toString())) {

       //处理一对多 一对多关系

       for (int m = 0; m < list.size(); m++) {

         Object d = list.get(m);

         //获取本模型的主键id

         Field field = ReflectUtil.getField(d.getClass(), "id");

         if (ReflectUtil.getFieldValue(d, field) != null) {

           String fromId = ReflectUtil.getFieldValue(d, field).toString();

           //查询关联表

           ModelBean modelBean = commonUtil.getModel(tempRel.getModel());

           BaseService baseService = modelBean.getBaseService();

           Map map = new HashMap(16);

           String desc = tempRel.getRelationType().getDesc();

           //获取发起方id

           String columnStart = desc.split("#")[0];

           String columnEnd = desc.split("#")[1];

           if (columnStart != null) {

             map.put(columnEnd, fromId);

           }

           List collects = baseService.list(map);

           ReflectUtil.setFieldValue(d, ReflectUtil.getField(d.getClass(), tempRel.getFieldName()), collects);

         }

       }

     } else {

       //处理多对多关联关系

       for (int m = 0; m < list.size(); m++) {

         Object d = list.get(m);

         Field field = ReflectUtil.getField(d.getClass(), "id");

         if (ReflectUtil.getFieldValue(d, field) != null) {

           String fromId = ReflectUtil.getFieldValue(d, field).toString();

           //查询中间表中的关联数据

           ModelRelationBean modelRelation = commonUtil.getModelRelation(tempRel.getModel());

           BaseRelationService relationService = modelRelation.getRelationService();

           Map map = new HashMap();

           map.put(UnderlineToCamelUtils.underlineToHump(tempRel.getKey()), fromId);

           List collects = relationService.list(map);

           List<BasePo> lists = new ArrayList<>();

           for (int nn = 0; nn < collects.size(); nn++) {

             Object o = collects.get(nn);

             Field toField = ReflectUtil.getField(o.getClass(), UnderlineToCamelUtils.underlineToHump(tempRel.getForeign()));

             String toId = ReflectUtil.getFieldValue(o, toField).toString();

             BasePo byId = commonUtil.getModel(tempRel.getReferModel()).getBaseService().findById(toId);

             lists.add(byId);

           }

           ReflectUtil.setFieldValue(d, ReflectUtil.getField(d.getClass(), tempRel.getFieldName()), lists);

         }

       }

     }

   }

分页参数转化:

//关联字段的查询
Object o = doProcess(entity, commonUtil, params, pageRequest);

策略模式处理分页不分页:

private Object doProcess(Entity entity, ModelCommonUtil commonUtil, Map<String, Object> params, PageRequest pageRequest) {
  QueryStrategy strategy = null;
  if (pageRequest != null) {
    //分页
    strategy = QueryStrategyContext.getStrategy(CommonQueryTypeEnum.PAGES);
  } else {
    //不分页
    strategy = QueryStrategyContext.getStrategy(CommonQueryTypeEnum.NOT_PAGES);
  }
  Object o = strategy.doQuery(entity, commonUtil, params, pageRequest);
  return o;
}

使用责任链模式重构后的代码如下:

//责任链调用 处理1对1 1对多 多对多
BaseChain.Builder chainBuild = new BaseChain.Builder();

chainBuild.addChain(new QueryOne2OneChain()).addChain(new QueryOne2ManyChain())
        .addChain(new QueryMany2ManyChain()).addChain(new QueryMany2ManyCodeChain());
chainBuild.build().doProcess(entity, commonUtil, list, null, null);

举报

相关推荐

0 条评论