获取满足条件的叶子节点,针对这些节点生成一颗非完整的树,减少展示非必要的树结构
步骤:
1.递归查询数据库,获取满足条件叶子节点的完整树分支(需要去重)
with recursive tree as (
select t1.* from t1 inner join t2 on 关联条件
where 满足条件的叶子节点
union all
select t3.* from t3 inner join tree t4 on 关联条件
)
select distinct * from tree
2.查数据库获取所有满足条件的叶子节点
select * from t1 inner join t2 on 关联条件
where 满足条件的叶子节点
3.java代码中生成非完整的树结构
List<TreeCatalog> treeNodeList = treeNode.stream().filter( node -> { // 获取所有顶层选项,过滤出根节点 return Boolean.TRUE; } ).map((menu) -> { // 给叶子节点 menu.setChildren(getChildren(menu, treeNode)); return menu; }).sorted(排序规则).collect(Collectors.toList());
递归获取叶子节点
private static List<TreeCatalog> getChildren(TreeCatalog treeCatalog, List<TreeCatalog> treeCatalogs){ List<TreeCatalog> optionsList = treeCatalogs.stream() .filter(o -> o.getParentId().equals(treeCatalog.getId())) .map((child) -> { child.setChildren(getChildren(child, treeCatalogs)); return child; }).sorted(Comparator.comparing(排序规则).collect(Collectors.toList()); return optionsList; }
4.将叶子节点设置到树中
private static void createChildren(TreeCatalog root, List<TreeCatalog> params){ if(null != root.getChildren() && !root.getChildren().isEmpty()){ for(TreeCatalog treeCatalog : root.getChildren()){ createChildren(treeCatalog, params); } } Object id = root.getId(); List<TreeCatalog> listTemp = params.stream().filter(x -> x.getId().equals(id)).collect(Collectors.toList()); if(!listTemp.isEmpty()){ root.getChildren().addAll(listTemp); } }
完成。