接受一个旧项目代码如下:
//处理关联的关系:
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);