递归建立数据库的字段要建立pid
既pid是父id
这里的pid要能在id找到 找到就说明当前id的组织是父组织 如果找不到就说明的顶级id 图中的主菜单1就是顶级组织
public Menu getMenuTree() {//先查询顶级目录LambdaQueryWrapper<Menu> menuLambdaQueryWrapper = new LambdaQueryWrapper<>();menuLambdaQueryWrapper.eq(Menu::getPid, "0");Menu menusBase = menuMapper.selectOne(menuLambdaQueryWrapper);//查询除了顶级组织以外的组织LambdaQueryWrapper<Menu> menuLambdaQueryWrapper2 = new LambdaQueryWrapper<>();menuLambdaQueryWrapper2.ne(Menu::getPid, "0");List<Menu> menuLNotBase = menuMapper.selectList(menuLambdaQueryWrapper2);List<Menu> menus = iterateMenus(menuLNotBase, menusBase.getId());menusBase.setMenuChildren(menus);return menusBase;}
反复调用iterateMenus方法 直到循环遍历结束
/*** 多级组织查询方法** @param menuVoList 不包含最高层次组织的组织集合* @param pid 父类id* @return*/public List<Menu> iterateMenus(List<Menu> menuVoList, String pid) {List<Menu> result = new ArrayList<>();int a =0;for (Menu menu : menuVoList) {//获取菜单的idString menuid = menu.getId();//获取菜单的父idString parentid = menu.getPid();if (parentid.equals(pid)) {//递归查询当前子菜单的子菜单List<Menu> iterateMenu = iterateMenus(menuVoList, menuid);menu.setMenuChildren(iterateMenu);result.add(menu);}}return result;}
Entity有些字段不需要 我加是因为自己的业务
@Data
@NoArgsConstructor
@TableName("Menu")
public class Menu {private String id;private String name;private String pid;@TableField(exist = false)private List<Menu> menuChildren;@TableField(exist = false)private Boolean nextRank;
}