一、java实现多级递归查询
1、实体类对象(省略了一些字段)
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("SYS_USER")
public class User {
private static final long serialVersionUID = -3089138238598051744L;
/**
* 账号
*/
@TableField("NAME")
private String name;
/**
* 密码
*/
@TableField("PASSWORD")
private String password;
/**
* 昵称
*/
@TableField("NICK_NAME")
private String nickName;
/**
* 备注
*/
@TableField("REMARK")
private String remark;
/**
* 工号
*/
@TableField("WORK_NUM")
private Integer workNum;
@TableField("PARENT_ID")
private String parentId;
@TableField(exist = false)
private List<User> children;
}
2、获取所有用户集合并调用子类查询方法
此处用了封装的HttpResponses返回参数类以及mybatisPlus查询集合
/**
* 查询用户等级
* @return
*/
@GetMapping("/userTree")
public HttpResponses<List<User>> findTree(){
//根节点
List<User> rootUser = new ArrayList<User>();
try {//查询所有菜单
List<User> allUsers = this.userService.query().eq(User::getStatus,StatusEnum.NORMAL)
.eq(User::getDirty,StatusEnum.NORMAL).list();
for (User nav : allUsers) {
if(nav.getLevelId().equals("0")){//父节点是0的,为根节点。
rootUser.add(nav);
}
}
/* 根据Menu类的order排序 */
//Collections.sort(rootUser, order());
//为根菜单设置子菜单,getClild是递归调用的
for (User nav : rootUser) {
/* 获取根节点下的所有子节点 使用getChild方法*/
List<User> childList = getChild(nav.getId(), allUsers);
nav.setChildren(childList);//给根节点设置子节点
}
} catch (Exception e) {
}
return success(rootUser);
}
3、获取子类用户
/**
* 获取子节点
* @param id 父节点id
* @param allUser 所有菜单列表
* @return 每个根节点下,所有子菜单列表
*/
public List<User> getChild(String id,List<User> allUser){
//子菜单
List<User> childList = new ArrayList<User>();
for (User nav : allUser) {
// 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
//相等说明:为该根节点的子节点。
if(nav.getLevelId().equals(id)){
childList.add(nav);
}
}
//递归
for (User nav : childList) {
nav.setChildren(getChild(nav.getId(), allUser));
}
//Collections.sort(childList,order());//排序
//如果节点下没有子节点,返回一个空List(递归退出)
if(childList.size() == 0){
return new ArrayList<User>();
}
return childList;
}
4、打完收工,结果自己调用看下就可以了