递归查询树列表

//基础类树形结构返回对象
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TreeBOClass extends ClassDO {

    List<TreeBOClass> children;

    public void addChild(TreeBOClass treeBOClass) {
        children.add(treeBOClass);
    }

}
//对象基础类
@TableName("****")
@KeySequence("****") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ClassDO extends BaseDO {

    /**
     * id
     */
    @TableId
    private Long id;
    /**
     * 父栏目id
     */
    private Long parentId;
    /**
     * 名称
     */
    private String categoryName;
    /**
     * 显示顺序
     */
    private Integer orderNum;
    /**
     * 状态:0正常 1停用 
     */
    private Integer status;

}

Controller: 


@GetMapping("/list-tree")
    @Operation(summary = "获取树形列表")
    @Parameter(name = "parentId", description = "父级id", example = "1024")
    @PreAuthorize("@ss.hasPermission('sys:list-tree')")
    public CommonResult<List<TreeBOClass>> getTreeList(Long parentId) {
        return success(classDOService.getTreeList(parentId));
    }

 service:


//获取目录树形结构集合
public List<TreeBOClass> getClassTreeList(Long parentId) {
        List<TreeBOClass> list = new ArrayList<>();
        List<TreeBOClass> treeList = getTreeDirectory(parentId);
        if (treeList == null) {
            return null;
        }
        TreeBOClass treeBOClass;
        for (TreeBOClass treeBO : treeList) {
            treeBOClass = packageDirectory(treeBO, Objects.nonNull(parentId) ? parentId : ParentEnum.ROOT.getParentId());
            list.add(treeBOClass);
        }
        return list;
    }

    private TreeBOClass packageDirectory(TreeBOClass parentBO, Long parentId) {
        TreeBOClass newParentBO = BeanUtils.toBean(parentBO, TreeBOClass.class);
        newParentBO.setParentId(parentId);
        newParentBO.setChildren(new ArrayList<>());

        // 递归复制子节点
        TreeBOClass newChildBO;
        for (TreeBOClass childBO : parentBO.getChildren()) {
            newChildBO = getDirectory(childBO, childBO.getParentId());
            newParentBO.addChild(newChildBO);
        }
        return newParentBO;
    }

    private List<TreeBOClass> getTreeDirectory(Long parentId) {
        List<ClassDO> classDOList = classDOMapper.selectList(new LambdaQueryWrapper<ClassDO>()
                .eq(ClassDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
                .eq(Objects.nonNull(parentId), OpenCategoryDO::getParentId, parentId)
                .orderByAsc(ClassDO::getOrderNum));

        Map<Long, List<TreeBOClass>> parentIdMap = new HashMap<>(16);
        List<TreeBOClass> treeList = new ArrayList<>();
        List<TreeBOClass> treeBOList;
        TreeBOClass treeBO;
        for (ClassDO classDO : classDOList) {
            treeBO = BeanUtils.toBean(classDO, TreeBOClass.class);
            treeList.add(treeBO);
            Long treeParentId = classDO.getParentId();
            if (parentIdMap.containsKey(treeParentId)) {
                treeBOList = parentIdMap.get(treeParentId);
                treeBOList.add(treeBO);
            } else {
                treeBOList = new ArrayList<>();
                treeBOList.add(treeBO);
                parentIdMap.put(treeParentId, treeBOList);
            }
        }
        // 设置子集
        List<TreeBOClass> children;
        for (TreeBOClass treeBO : treeList) {
            children = parentIdMap.get(treeBO.getId());
            if (children == null) {
                treeBO.setChildren(new ArrayList<>());
            } else {
                treeBO.setChildren(children);
            }
        }
        // 返回顶端数据
        return parentIdMap.get(Objects.nonNull(parentId) ? parentId : ParentEnum.ROOT.getParentId());
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值