【Java 查询树结构列表,递归删除子节点】

Java 获取列表树结构,递归删除子节点

  • 数据库表结构
  • Model
  • VO
  • 查询树结构列表
  • 递归删除子节点

数据库表结构

在这里插入图片描述

Model

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TBaseDept
{/** ID */private String id;/** 单位名称 */private String fdName;/** 部门编码 */private String fdCode;/** 层级 */private String fdLevel;/** 上级单位ID */private String parentId;/** 上级单位名称 */private String parentName;/** 层级ID */private String fdHier;/** 层级路径 */private String fdHierPath;/** 预留字段1 */private String fdOne;/** 预留字段2 */private String fdTwo;/** 预留字段3 */private String fdThree;/** 状态:1-正常 2:无效 */private String fdStatus;/** 排序号 */private Integer fdOrder;
}

VO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TBaseDeptVO implements Serializable
{private static final long serialVersionUID = 8599451909890724624L;/** ID */private String id;/** 单位名称 */private String fdName;/** 部门编码 */private String fdCode;/** 层级 */private String fdLevel;/** 上级单位ID */private String parentId;/** 上级单位名称 */private String parentName;/** 层级ID */private String fdHier;/** 层级路径 */private String fdHierPath;/** 预留字段1 */private String fdOne;/** 预留字段2 */private String fdTwo;/** 预留字段3 */private String fdThree;/** 状态:1-正常 2:无效 */private String fdStatus;/** 排序号 */private Integer fdOrder;private List<TBaseDeptVO> children;
}

查询树结构列表

    public List<TBaseDeptVO> queryTree(TBaseDept tBaseDept){List<TBaseDept> tBaseDeptList = tBaseDeptDao.findByCriteria(tBaseDept);return buildTree(tBaseDeptList, "0");}/*** 构建树结构* @param list 数据列表* @param parentId 父ID* @return list*/private List<TBaseDeptVO> buildTree(List<TBaseDept> list, String parentId){List<TBaseDeptVO> tree = new ArrayList<>();for (TBaseDept child : list){if (child.getParentId().equals(parentId)){TBaseDeptVO tBaseDeptVO = new TBaseDeptVO();BeanUtil.copyProperties(child, tBaseDeptVO);// 递归构建子树List<TBaseDeptVO> children = buildTree(list, child.getId());List<TBaseDeptVO> collect = children.stream().sorted(Comparator.comparing(TBaseDeptVO::getFdOrder)).collect(Collectors.toList());tBaseDeptVO.setChildren(collect);tree.add(tBaseDeptVO);}}return tree;}

递归删除子节点

    public void deleteDept(TBaseDept tBaseDept){String id = tBaseDept.getId();List<String> ids = queryChildNodes(id);tBaseDeptService.delete(ids);}/*** 递归查询所有子节点ID* @param id 父ID* @return ids*/private List<String> queryChildNodes(String id){List<String> ids = new ArrayList<>();// 查询数据库中所有与父节点关联的子节点TBaseDept dept = new TBaseDept();dept.setParentId(id);List<TBaseDept> childIds = tBaseDeptService.queryList(dept);// 递归删除子节点for (TBaseDept childId : childIds){queryChildNodes(childId.getId());ids.add(childId.getId());}ids.add(id);return ids;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/690193.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山东大学软件学院创新项目实训开发日志——第11周

山东大学软件学院创新项目实训开发日志——第11周 项目名称&#xff1a;ModuFusion Visionary&#xff1a;实现跨模态文本与视觉的相关推荐 -------项目目标&#xff1a; 本项目旨在开发一款跨模态交互式应用&#xff0c;用户可以上传图片或视频&#xff0c;并使用文本、点、…

Kafka效率篇-提升效率三板斧

kafka在效率上做了很多的努力。最初的一个使用场景是处理网页上活跃的数据&#xff0c;它往往有非常大的体量&#xff0c;每个页面都能产生数十条写入。而且我们假设每条消息都会被至少一个消费者消费&#xff08;通常是多个&#xff09;&#xff0c;因此&#xff0c;我们努力让…

2 GPIO控制

ESP32的GPIO的模式&#xff0c;一共有输入和输出模式两类。其中输入模式&#xff1a;上拉输入、下拉输入、浮空输入、模拟输入&#xff1b;输出模式&#xff1a;输出模式、开漏输出&#xff08;跟stm32八种输入输出模式有所不同&#xff09;。库函数中控制引脚的函数如下&#…

如何将Hyper-V转VMware?反之亦可

为何要在Hyper-V和VMware之间进行转换呢&#xff1f; 尽管VMware和Microsoft Hyper-V都是当前流行的一类虚拟机监控程序&#xff0c;但它们并不相互兼容。VMware产品使用VMDK格式创建虚拟磁盘&#xff0c;而Hyper-V则使用VHD或VHDX格式创建虚拟磁盘。 有时您可能需要进行这种转…

解读丰田生产方式的工作原理

丰田生产方式&#xff0c;被誉为现代制造业的瑰宝&#xff0c;以其独特的精益生产理念&#xff0c;引领了全球制造业的变革。本文将从丰田生产方式的核心理念、两大支柱、应用实践以及面临的挑战等方面&#xff0c;全面解读其工作原理。 丰田生产方式&#xff0c;又称精益生产&…

弱监督语义分割-对CAM的生成过程进行改进1

一、仿射变换图像结合正则项优化CAM生成 论文&#xff1a;Self-supervised Equivariant Attention Mechanism for Weakly Supervised Semantic Segmentation &#xff08;CVPR,2020&#xff09; 1.SEAM方法 孪生网络架构&#xff08;Siamese Network Architecture&#xff09…

圆柱齿轮的旋向如何判断?

上期出了个题&#xff0c;给了两个内齿轮&#xff0c;请大家来判断他们的旋向&#xff0c;看到了有不少小伙伴评论给出了自己的答案&#xff0c;正确和错误差不多各半吧&#xff0c;错的占比要大一些。这期咱们就好好聊一聊这个问题。 外齿轮的旋向大家貌似判断都没什么问题&a…

数据的均匀化分割算法(网格划分法、四叉树法(含C++代码))

数据的均匀化分割主要是指在分割过程中尽可能均匀地将数据点分布在各个子区域中&#xff0c;以保持数据分布的平衡和优化数据结构的性能。以下是几种可以实现数据均匀化分割的方法&#xff1a; 一. 网格划分法 1. 基本概念 虽然传统的网格划分法不是动态调整的&#xff0c;但通…

Android AOSP Ubuntu源码编译电脑卡顿问题定位解决

文章目录 问题概述分析问题解决问题查看交换分区创建交换分区删除交换分区调整交换分区的活跃度 问题概述 开发SystemUI时&#xff0c;使用内存为16G的主机&#xff0c;Ubuntu 20.04的系统编译SystemUI的源码&#xff0c;编译的过程中发现电脑卡顿&#xff0c;鼠标不能移动。必…

vue2 八大组件通信,父子通信,跨层级通信,事件总线,vuex等

文章目录 什么是组件通信&#xff1f;父子通信流程propsProps 定义Props 作用特点数组写法对象写法&#xff08;props校验&#xff09;简写只验证数据类型&#xff1a;完整写法&#xff0c;完整的验证&#xff1a; props父向子传值用props父传子在子组件中修改props $emit子向父…

scrapy的入门

今天我们先学习一下scrapy的入门,Scrapy是一个快速的高层次的网页爬取和网页抓取框架&#xff0c;用于爬取网站并从页面中提取结构化的数据。 1. scrapy的概念和流程 1.1 scrapy的概念 我们先来了解一下scrapy的概念,什么是scrapy: Scrapy是一个Python编写的开源网络爬虫框架…

【VTKExamples::Rendering】第四期 相机插值(CameraInterpolate)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例CameraInterpolate,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. CameraInterpol…