//递归模糊查询(从里到外)
with recursive cte as
(
select * from res_tree
res_tree.del_flag = ‘0’
and res_tree.res_name like concat(’%’,#{resName},’%’)
union
select m.* from res_tree m, cte where m.id = cte.parent_id
)
select * from cte
//通过id递归查询该节点以及包含的子节点 (从外到里)
with recursive cte as
(
– 先查询root节点
select *
from res_tree
where res_tree.id = #{id}
union all
– 通过cte递归查询root节点的直接子节点
select origin.*
from cte
join res_tree as origin on origin.parent_id = cte.id
)
select *
from cte;**
//代码中遍历递归封装数据
@Override
public List queryTreeList(Tree tree) {
List treeList = treeMapper.selectTreeList(tree);
List collect = treeList.stream()
.filter(root -> root.getParentId().equals(“0”))
.map(root -> {
root.setChildren(getChildrenTree(root,treeList));
return root;
})
.collect(Collectors.toList());
return collect;
}
/**
* 递归获取子列表
* @param root
* @param treeList
* @return
*/
private List<TreeVo> getChildrenTree(TreeVo root, List<TreeVo> treeList) {
List<TreeVo> treeVoList = treeList.stream()
.filter(cate -> root.getId().equals(cate.getParentId()))
.map(cate -> {
cate.setChildren(getChildrenTree(cate,treeList));
return cate;
})
.sorted(Comparator.comparing(Tree::getSortOrder))
.collect(Collectors.toList());
return CollectionUtils.isEmpty(treeVoList) ? Collections.emptyList() : treeVoList;
}