树表转换成有层次的List列表(无限层级)
我的项目环境:mybaits plus
我负责的模块:course_category(课程分类模块)
方法一,传统的遍历组装
这一个方法有问题,先别用
方法二,Hutool自带TreeUtil
@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)
[{"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 中自带了 无限层级树 的工具方法,不用自己写任何递归。
@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<>();
}
@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);}
}