/**
* 递归查询树形结构(带注释模板)
* 适用场景:根据父ID查询子节点并嵌套为树形结构(如分类、菜单、部门等)
*/
public List<{Entity}> getTree(Long parentId) {
// 1. 处理父ID为空的情况(默认查根节点)
parentId = (parentId == null) ? {RootParentId} : parentId;
// 2. 构建查询条件:查询parentId对应的子节点
LambdaQueryWrapper<{Entity}> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq({Entity}::{ParentIdField}, parentId); // 例如:Entity::getParentId
List<{Entity}> list = {entityMapper}.selectList(queryWrapper); // 例如:departmentMapper
// 3. 递归查询并设置子节点(核心逻辑)
if (!CollectionUtils.isEmpty(list)) {
list.forEach(item -> {
// 递归调用自己,将当前节点的ID作为父ID查询子节点
List<{Entity}> children = getTree(item.getId());
item.set{ChildrenField}(children); // 例如:setChildren
});
}
return list;
}
模板使用说明(替换占位符)
占位符 | 说明 | 示例 |
---|---|---|
{Entity} | 你的实体类名(如分类、菜单、部门等) | TbGoodsCategory |
{ParentIdField} | 实体类中表示父ID的字段(需符合Lambda表达式写法) | TbGoodsCategory::getParentId |
{RootParentId} | 根节点的父ID值(通常为0或-1,根据业务定) | 0L |
{ChildrenField} | 实体类中存储子节点的集合字段(需有对应的set方法) | setChildren |
{entityMapper} | MyBatis Plus的Mapper对象(首字母小写的实体类名 + Mapper) | tbGoodsCategoryMapper |