树表转换成有层次的List列表(无限层级)

我的项目环境:mybaits plus

我负责的模块:course_category(课程分类模块)

方法一,传统的遍历组装

这一个方法有问题,先别用

方法二,Hutool自带TreeUtil

java 复制代码
    @GetMapping("/tree2")
    public List tree() {
        // 1.取出所有的课程分类
        List<CourseCategory> list = categoryService.list();
        // 2. Hutool 配置
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        // 3.设置一下这个最大深度,建议必须设置
        treeNodeConfig.setDeep(2);

        // 3. 直接生成树(根节点 parentId = "0")
        List<Tree<String>> tree = TreeUtil.build(
                list,
                "0",
                treeNodeConfig,
                (category, treeNode) -> {
                    // 一定要setId和setParentId才会出现树
                    treeNode.setId(category.getId());
                    treeNode.setParentId(category.getParentId());
                    treeNode.setName(category.getCategoryName());

                    //下面是用allgetset插件一键取出这个类的所有
                    String categoryCode = category.getCategoryCode();
                    Integer level = category.getLevel();
                    String parentId = category.getParentId();
                    LocalDateTime createTime = category.getCreateTime();
                    String createBy = category.getCreateBy();
                    Integer courseCount = category.getCourseCount();
                    Integer subCategoryCount = category.getSubCategoryCount();
                    Integer totalCourseCount = category.getTotalCourseCount();
                    List<CourseCategory> children = category.getChildren();

                    // 把上面取出来的值都putExtra进去,除了children。children他会自动组装
                    // children不能添加,肯定会出现问题
                    treeNode.putExtra("categoryCode", categoryCode);
                    treeNode.putExtra("level", level);
                    treeNode.putExtra("parentId", parentId);
                    treeNode.putExtra("createTime", createTime);
                    treeNode.putExtra("createBy", createBy);
                    treeNode.putExtra("courseCount", courseCount);
                    treeNode.putExtra("subCategoryCount", subCategoryCount);
                    treeNode.putExtra("totalCourseCount", totalCourseCount);
                }
        );
        return tree;
    }

返回结果:(id,parentId,name是set进去的,children是自动组装的,其他的字段要通过putExtra)

java 复制代码
[
    {
        "id": "18bfc4df4e7b462eaf125b5999a20edf",
        "parentId": "0",
        "name": "组织协同",
        "categoryCode": "10000258",
        "level": 1,
        "createTime": "2025-08-19T13:39:05",
        "createBy": "cs_huiren",
        "courseCount": 0,
        "subCategoryCount": 1,
        "totalCourseCount": 1,
        "children": [
            {
                "id": "2f46ba4e2cec46eaab1a9a6c313bc503",
                "parentId": "18bfc4df4e7b462eaf125b5999a20edf",
                "name": "领导力培养",
                "categoryCode": "21AD45AF",
                "level": 2,
                "createTime": "2025-08-19T13:39:22",
                "createBy": "cs_huiren",
                "courseCount": 1,
                "subCategoryCount": 0,
                "totalCourseCount": 1,
                "children": null
            }
        ]
    },
    {
        "id": "812b471578f34044a9ccf5da00022e61",
        "parentId": "0",
        "name": "项目管理 ",
        "categoryCode": "10007462",
        "level": 1,
        "createTime": "2025-08-13T08:26:04",
        "createBy": "cs_huiren",
        "courseCount": 2,
        "subCategoryCount": 5,
        "totalCourseCount": 7,
        "children": [
            {
                "id": "3e9c662f66d64744aabea94ba9002dfa",
                "parentId": "812b471578f34044a9ccf5da00022e61",
                "name": "职能支撑 ",
                "categoryCode": "280EE3C3",
                "level": 2,
                "createTime": "2025-08-13T09:06:05",
                "createBy": "cs_huiren",
                "courseCount": 4,
                "subCategoryCount": 4,
                "totalCourseCount": 5,
                "children": null
            }
        ]
    },
    {
        "id": "98c858bfa9114c18bc2c60db6e40c8c0",
        "parentId": "0",
        "name": "技术文档",
        "categoryCode": "10001069",
        "level": 1,
        "createTime": "2025-08-13T09:31:52",
        "createBy": "cs_huiren",
        "courseCount": 2,
        "subCategoryCount": 0,
        "totalCourseCount": 2
    }
]

方法三,mybatisplus自带

MyBatis-Plus 从 3.5.3 开始 已经在 mybatis-plus-extension 中自带了 无限层级树 的工具方法,不用自己写任何递归。

java 复制代码
@Data
@TableName("category")
public class Category {

    private String id;          // 主键
    private String parentId;    // 父节点
    private String categoryName;

    // 子节点,名字固定叫 children
    @TableField(exist = false)
    private List<Category> children = new ArrayList<>();
}
java 复制代码
@RestController
@RequiredArgsConstructor
public class CategoryController {
    private final CategoryMapper categoryMapper;

    @GetMapping("/tree")
    public List<Category> tree() {
        return TreeHelper.build(
                categoryMapper.selectList(null),
                Category::getId,
                Category::getParentId,
                Category::getChildren
        );
    }
}