参考资料:https://www.cnblogs.com/linjiqin/p/3148066.html
// 递归查询所有机构 public Msg selectOrgAndChildrenById(String orgId) { try { Org orgTree = recursiveTree(orgId);//调用递归方法 return Msg.success().add("data", orgTree);//返回查询的递归数据 } catch (Exception e) { logger.error(String.format("查询异常,错误描述 [%s]", e.getMessage())); return Msg.fail(); } } //递归方法 private Org recursiveTree(String orgId) { Org node = orgMapper.selectByPrimaryKey(orgId);//根据传入机构id获取顶层节点 List<Org> orgs = orgMapper.selectOrgChildrenByParentId(orgId); //把传入id当做父类id查询得出子节点 //遍历子节点 for (Org child :orgs) { //遍历每个子节点 Org n = recursiveTree(child.getOrgid());//调用自身递归方法传入当前对象的id node.getNodes().add(n); //将查询的子节点对象封装在list集合里 } return node; }
需要注意,对要递归的实体类里加上集合对象,就是所谓的节点。是为了将查询的子类封装进去。
private List nodes = new ArrayList(); public List getNodes() { return nodes; } public void setNodes(List nodes) { this.nodes = nodes; }
思路:先查询得到顶级节点。就是根据传入的id进行主键查询
然后在进行子类查询!就是将传入的id当做父类来查询,遍历所有子类,调用自身递归的方法,如果没有会自动停止递归。最后把子类放进用主键查询的对象里返回。