一、说明:
做项目时,遇到这样一个业务,需要将某个数据库表中的基本数据转化为树形结构返回给前端(基础数据中分为三级:主线、一级、二级),这些数据在存储时分别存储了父级数据的id,并且每一级又分两个主线。
我的做法是按照需求将数据查出,然后在后端利用递归进行树形结构转换。
数据库表结构:
前端返回数据
public class ProjectLineModel {
/**
* 主线id
*/
@ApiModelProperty(value = "主线id")
private String lineid;
/**
* 主线名称
*/
@ApiModelProperty(value = "主线名称")
private String lineName;
/**
* 一级项目(主线中嵌套一级项目model)
*/
@Transient
private List<ProjectOneModel> listOne;
}
public class ProjectOneModel {
/**
* 项目id
*/
@ApiModelProperty(value = "项目id")
@Column(name = "id")
private String projectId;
/**
* 项目名称
*/
@ApiModelProperty(value = "项目名称")
private String projectName;
/**
* 父级id
*/
@ApiModelProperty(value = "父级id")
private String parent;
/**
* 项目级别
*/
@ApiModelProperty(value = "项目级别")
private int level;
/**
* 优先级
*/
@ApiModelProperty(value = "优先级")
private int priority;
/**
* 下一级级项目(一级项目嵌套二级项目、但由于一二级项目的model相同这里就用了一个)
*/
@Transient
private List<ProjectOneModel> listNext;
}
二、解决方法
service代码
实现方法:
public List<ProjectLineModel> selectAllProject(int pageNo, int pageSize) {
// 实例化树形结构
List<ProjectLineModel> lineModelList;
// 查询主线
List<ProjectLineModel> lineProject = participationDao.selectLineProject(0);
// 查询一二级项目
List<ProjectOneModel> oneAndTwoProject = participationDao.selectOneAndTwoProject();
// 遍历主线,添加主线model中list的内容(应用java8新特性 流)
lineModelList=lineProject.stream()
.map(line -> line.setListOne(setChildProject(line.getLineid(),oneAndTwoProject)))
.collect(Collectors.toList());
return lineModelList;
}
递归方法:
/**
* 递归方法实现树形结构
* @param ParentId 父级项目id
* @param oneAndTwoProject 所有一二级项目
* @return
*/
public List<ProjectOneModel> setChildProject(String ParentId, List<ProjectOneModel> oneAndTwoProject) {
// 定义一级项目model
List<ProjectOneModel> ProjectList1 = new ArrayList<>();
// 为一级项目添加内容
ProjectList1= oneAndTwoProject.stream()
.filter(pro -> pro.getParent().equals(ParentId))
.collect(Collectors.toList());
if (ProjectList1.size() == 0) {
return null;
}
// 为二级项目添加内容,添加一级项目中list的内容
ProjectList1.stream()
.map(child ->child.setListNext(setChildProject(child.getProjectId(), oneAndTwoProject)))
.collect(Collectors.toList());
return ProjectList1;
结果:
{
"code": "0000",
"message": "查询成功",
"data": [
{
"lineid": "1137190657425674241",
"lineName": "计算机",
"listOne": [
{
"projectId": "1147028439530016771",
"projectName": "入门",
"parent": "1137190657425674241",
"level": 1,
"priority": 0,
"listNext": [
{
"projectId": "1151648863681298433",
"projectName": "开学典礼",
"parent": "1147028439530016771",
"level": 2,
"priority": 0
},
{
"projectId": "1151648863886819329",
"projectName": "快捷键和搜索引擎使用",
"parent": "1147028439530016771",
"level": 2,
"priority": 1
},
{
"projectId": "1151648864042008578",
"projectName": "进制的转换、计算机组成原理、三八译码器",
"parent": "1147028439530016771",
"level": 2,
"priority": 3
},,,,,,,,