通过Java构建树形结构所需要的数据
实体类Test
/** 主键 */
private String id;
/** 父类ID */
private String parentId;
// 子节点
private List<Test> children;
/** 名称 */
private String name;
buildTreeByStream
入参为list
我这里当节点的parentId = ‘-1’ 那么这个节点就是根节点
// list 是从数据库请求回来的数据
@Override
public List<Test> selectTestList(Test test)
{
List<Test> list = TestMapper.selectList(test);
// 返回树结构
return buildTreeByStream(list);
}
// 构建前端所需要树
public static List<Test> buildTreeByStream(List<Test> list){
// 获取根节点
List<Test> root = list.stream().filter(item -> "-1".equals(item.getParentId())).collect(Collectors.toList());
// 根据pid 进行分组
Map<String,List<Test>> map = list.stream().collect(Collectors.groupingBy(Test::getParentId));
recursionFnTree(list,map);
return root;
}
// 递归
public static void recursionFnTree(List<Test> list, Map<String,List<Test>> map){
for (Test test: list) {
List<Test> childList = map.get(Test.getId());
test.setChildren(childList);
if (null != childList && 0<childList.size()){
recursionFnTree(childList,map);
}
}
}
使用sql查询树形结构 (以若依的部门表为例,主要用于查该部门与子部门)
WITH RECURSIVE cte AS (
SELECT dept_id,parent_id,dept_name FROM `sys_dept` WHERE dept_id = '100' # 参数
UNION ALL
SELECT aa.dept_id,aa.parent_id,aa.dept_name FROM sys_dept aa,cte WHERE aa.parent_id = cte.dept_id
)
SELECT * FROM cte;