原理
1.创建带有关系型的实体类 Aircraft(id、pid、content、List<Aircraft> )
2.通过两表(或多表之前的id、pid建立关联)
3.用Stream过滤包装
效果 (前端用的vue的<el-tree>标签接的)

需求
我的需求是三张表建立关联 如 t1 t2 t3,
t1的id和t2的pid关联,t2的id和t3的pid关联。
一、创建实体
@Data
public class Aircraft {
/**
* id
*/
private Long id;
/**
* 父id
*/
private Long pid;
/**
* 名称
*/
private String name;
/**
* 子节点集合
*/
private List<Aircraft> children = new ArrayList<Aircraft>();
public Aircraft(Long id, Long pid, String aircraftType) {
this.id = id;
this.pid = pid;
this.name = aircraftType;
}
}
二、Controller
/**
* 初开页面 menu全部展示
*/
@GetMapping("/queryMenuTypeApi")
public AjaxResult queryMenuTypeApi(){
return success(aircraftService.queryMenuType());
}
三、Service
List<TreeSelect> queryMenuType();
四、Impl
@Override
public List<TreeSelect> queryMenuType() {
//所有机型 表t1
List<ConditionVo> knowledgeIdList = aircraftMapper.queryModel();
List<Long> knowledgeIds = knowledgeIdList.stream().map( ConditionVo::getId ).collect(Collectors.toList());
//机型对应的编号 表t2
List<ConditionVo> aircraftNoList = aircraftMapper.queryModelNumber(knowledgeIds);
List<Long> ids = aircraftNoList.stream().map(ConditionVo::getId).collect(Collectors.toList());
//编号对应的工况树 表t3
List<ConditionVo> conditionVos = aircraftMapper.queryTreeCondition(ids);
List<Long> conIds = conditionVos.stream().map(ConditionVo::getId).collect(Collectors.toList());
//工况树对应的详情表
// List<ConditionVo> conditionVoss = aircraftMapper.queryTreeConditionDetails(conIds);
//封装工况树
//1.封装父类
List<Aircraft> aircrafts = new ArrayList<>();
aircrafts.add(new Aircraft(1L, 0L, "工况"));
// aircrafts.add(new Aircraft(2L, null, "载荷"));
// aircrafts.add(new Aircraft(3L, null, "AF"));
//2.封装机型
List<Aircraft> knowledgeAircraftVos = knowledgeIdList.stream()
.map(knowledge -> new Aircraft(knowledge.getId(), 1L, knowledge.getAircraftType()))
.collect(Collectors.toList());
//3.封装编号
List<Aircraft> aircraftNoListVos = aircraftNoList.stream()
.map(aircraftNo -> new Aircraft(aircraftNo.getId(), aircraftNo.getKnowledgeId(), aircraftNo.getAircraftNo()))
.collect(Collectors.toList());
//4.文件名称
List<Aircraft> conditionTree = conditionVos.stream()
.map(Tree -> new Aircraft(Tree.getId(), Tree.getCatalogId(), Tree.getFileNameTime()))
.collect(Collectors.toList());
//------start
//找出父节点
List<Aircraft> parentList = aircrafts.stream()
.filter(e -> e.getPid() == 0
|| "".equals(e.getPid()))
.collect(Collectors.toList());
//通过倒叙组装,比正序方便
//3-4
List<Aircraft> aircrafts1 = get34(aircraftNoListVos, conditionTree);
//2-3-4
List<Aircraft> aircrafts2 = get234(knowledgeAircraftVos, aircrafts1);
//1-2-3-4
List<Aircraft> aircrafts3 = get1234(aircrafts, aircrafts2);
//------end
List<TreeSelect> result = aircrafts3.stream().map(TreeSelect::new).collect(Collectors.toList());
return result;
}
五、使用Stream,把子节点放入父节点下
//1234
private List<Aircraft> get1234(List<Aircraft> aircrafts,List<Aircraft> aircrafts2) {
for (Aircraft exportOrganization : aircrafts) {
List<Aircraft> subList = aircrafts2.stream().filter(o -> o.getPid()
.equals(exportOrganization.getId())).collect(Collectors.toList());
exportOrganization.setChildren(subList);
}
return aircrafts;
}
//234
private List<Aircraft> get234(List<Aircraft> knowledgeAircraftVos,List<Aircraft> aircrafts1) {
for (Aircraft exportOrganization : knowledgeAircraftVos) {
List<Aircraft> subList = aircrafts1.stream().filter(o -> o.getPid()
.equals(exportOrganization.getId())).collect(Collectors.toList());
exportOrganization.setChildren(subList);
}
return knowledgeAircraftVos;
}
//34
private List<Aircraft> get34(List<Aircraft> aircraftNoListVos,List<Aircraft> conditionTree) {
for (Aircraft exportOrganization : aircraftNoListVos) {
List<Aircraft> subList = conditionTree.stream().filter(o -> o.getPid()
.equals(exportOrganization.getId())).collect(Collectors.toList());
exportOrganization.setChildren(subList);
}
return aircraftNoListVos;
}
六、返回格式
@Data public class TreeSelect implements Serializable { private static final long serialVersionUID = 1L; /** 节点ID */ private Long id; /** 节点名称 */ private String label; /** 子节点 */ @JsonInclude(JsonInclude.Include.NON_EMPTY) private List<TreeSelect> children; public TreeSelect(SysDept dept) { this.id = dept.getDeptId(); this.label = dept.getDeptName(); this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); } public TreeSelect(SysMenu menu) { this.id = menu.getMenuId(); this.label = menu.getMenuName(); this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); } public TreeSelect(Aircraft aircraft) { this.id = aircraft.getId(); this.label = aircraft.getName(); this.children = aircraft.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); } }
本文介绍了如何利用Java的StreamAPI处理数据库查询结果,实现在多表关联场景下生成前端Vue项目中的树状结构,以`Aircraft`类为基础并结合`<el-tree>`组件展示数据。
1919

被折叠的 条评论
为什么被折叠?



