1. A auto-junção do mysql
é adequada para os dados planos dos nós folha, só precisa se auto-juntar à tabela, o número de conexões é igual ao número de camadas -1,
se você precisar de 1 1-1 1-1 -1, você precisa se conectar duas vezes
SELECT
one.id one_id,
one.label one_label,
two.id two_id,
two.label two_label
FROM
course_category AS one
INNER JOIN course_category AS two ON one.id = two.parentid
WHERE
one.parentid = '1'
AND one.is_show = '1'
AND two.is_show = '1'
ORDER BY
one.orderby,
two.orderby
2. Recursão (Geral)
1.
public CourseCategoryTreeDto buildTree(List<CourseCategory> categories, String parentId) {
CourseCategoryTreeDto parentNode = new CourseCategoryTreeDto();
List<CourseCategoryTreeDto> childrenNodes = new ArrayList<>();
for (CourseCategory category : categories) {
if (category.getParentid().equals(parentId)) {
CourseCategoryTreeDto childNode = new CourseCategoryTreeDto();
childNode.setId(category.getId());
childNode.setName(category.getName());
childNode.setLabel(category.getLabel());
childNode.setIsShow(category.getIsShow());
childNode.setOrderby(category.getOrderby());
childNode.setIsLeaf(category.getIsLeaf());
childNode.setParentid(parentId);
// 如果该节点是父节点,则递归处理其子节点
if (category.getIsLeaf() == 0) {
CourseCategoryTreeDto childTree = buildTree(categories, category.getId());
childNode.setChildrenTreeNodes(childTree.getChildrenTreeNodes());
} else {
childNode.setChildrenTreeNodes(null);
}
childrenNodes.add(childNode);
}
}
parentNode.setChildrenTreeNodes(childrenNodes);
return parentNode;
}
2. Use fluxos
public CourseCategoryTreeDto buildTree(List<CourseCategory> categories, String parentId) {
List<CourseCategoryTreeDto> childrenNodes = categories.stream()
.filter(category -> category.getParentid().equals(parentId))
.map(category -> {
CourseCategoryTreeDto childNode = new CourseCategoryTreeDto();
childNode.setId(category.getId());
childNode.setName(category.getName());
childNode.setLabel(category.getLabel());
childNode.setIsShow(category.getIsShow());
childNode.setOrderby(category.getOrderby());
childNode.setIsLeaf(category.getIsLeaf());
childNode.setParentid(parentId);
// 如果该节点是父节点,则递归处理其子节点
if (category.getIsLeaf() == 0) {
CourseCategoryTreeDto childTree = buildTree(categories, category.getId());
childNode.setChildrenTreeNodes(childTree.getChildrenTreeNodes());
} else {
childNode.setChildrenTreeNodes(null);
}
return childNode;
})
.collect(Collectors.toList());
CourseCategoryTreeDto parentNode = new CourseCategoryTreeDto();
parentNode.setChildrenTreeNodes(childrenNodes);
return parentNode;
}
método de chamada
public List<CourseCategoryTreeDto> getCourseCategoryTreeDto() {
//找出所有可以显示的节点
List<CourseCategory> courseCategories = courseCategoryMapper.selectList(new QueryWrapper<CourseCategory>().eq("is_show",1));
CourseCategoryTreeDto courseCategoryTreeDto = buildTree(courseCategories, "1");
//找到根节点
return courseCategoryTreeDto.getChildrenTreeNodes();
}
resultado