当前位置: 首页 > news >正文

java 查询树结构数据,无限层级树结构通用方法

1、数据库表数据

2、controller层TestTree简单测试
@RestController
@RequestMapping("/test")
public class testTreeController {@Autowiredprivate TestTreeService testTreeService;@GetMapping("/list")public List<TestTree> List(TestTree tree){List<TestTree> testTrees = testTreeService.getTreeList(tree);return testTrees;}
}
3、TestTree实体类
@TableName(value ="test_tree")
@Data
public class TestTree implements TreeNode {/*** id*/@TableIdprivate String id;/*** 父级id*/private String pid;/*** 名称*/private String name;/*** 类型*/private String type;@TableField(exist = false)private static final long serialVersionUID = 1L;@TableField(exist = false)private List childNodeList = new ArrayList<>();@Overridepublic void setChildNodeList(List childNodeList) {this.childNodeList = childNodeList;}@Overridepublic List getChildNodeList() {return childNodeList;}
}
4、TestTreeService 接口
public interface TestTreeService extends IService<TestTree> {/*** 查找树结构List* @param tree 查询条件* @return 树结构结果*/List<TestTree> getTreeList(TestTree tree);
}
5、TestTreeServiceImpl 实现类
@Service
public class TestTreeServiceImpl extends ServiceImpl<TestTreeMapper, TestTree>implements TestTreeService{public List<TestTree> selectList(TestTree tree) {LambdaQueryWrapper<TestTree> queryWrapper = new LambdaQueryWrapper();queryWrapper.eq(ObjectUtil.isNotEmpty(tree.getId()), TestTree::getId, tree.getId());queryWrapper.like(ObjectUtil.isNotEmpty(tree.getName()), TestTree::getName, tree.getName());queryWrapper.like(ObjectUtil.isNotEmpty(tree.getType()), TestTree::getType, tree.getType());return super.list(queryWrapper);}@Overridepublic List<TestTree> getTreeList(TestTree tree) {//查询数据List<TestTree> list  = this.selectList(tree);//封装树结构,通用方法,参数为传入的ListList<TestTree> treeList = TreeList.getTreeList(list);//返回树结构Listreturn  treeList;}
}
6、构建树结构
6.1、定义TreeNode
public interface TreeNode<E extends TreeNode> {/*** 获取节点ID*/String getId();/*** 获取父ID*/String getPid();void setChildNodeList(List<E> childNodeList);/*** 子节点数据*/List<E> getChildNodeList();
}
6.2、构建树结构
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;/*** 处理树形结构的数据*/
public final class TreeList {public static <E extends TreeNode> List<E> getTreeList(List<E> allData){//通过流操作,过滤出所有pid为空或者为null的节点,就是树的顶层节点List<E> topNode = allData.stream().filter(item -> Objects.isNull(item) || StrUtil.isBlank(item.getPid())).collect(Collectors.toList());//移除所有pid为空或为null的节点allData.removeIf(item->Objects.isNull(item) || StrUtil.isBlank(item.getPid()));//将剩余节点按pid分租,结果存储在map中,pid作为键,节点列表作为值Map<String, List<E>> map = allData.stream().collect(Collectors.groupingBy(TreeNode::getPid));//构建树形结构buildTree(topNode,map);//返回顶层节点列表return topNode;}//构建树形结构public static <E extends TreeNode> void buildTree(List<E> topNode, Map<String,List<E>> map){for (E node : topNode) {//遍历顶层节点,如果节点为null,则跳过if (Objects.isNull(node)){continue;}//获取当前节点的idString id = node.getId();//从map中获取其子节点列表List<E> treeNodes = map.get(id);//将其设置为当前节点的子节点列表node.setChildNodeList(treeNodes);//如果当前节点没有子节点,则继续下一个节点if (CollectionUtil.isEmpty(treeNodes)){continue;}//对当前节点的子节点列表递归调用buildTree方法,继续构建树形结构buildTree(treeNodes,map);}}
}
7、postman测试

 结果

[{"id": "1","pid": null,"name": "第一层级","type": "1","childNodeList": [{"id": "2","pid": "1","name": "第二层级","type": "2","childNodeList": [{"id": "3","pid": "2","name": "第三层级","type": "3","childNodeList": [{"id": "4","pid": "3","name": "第四层级","type": "4","childNodeList": [{"id": "5","pid": "4","name": "第五层级","type": "5","childNodeList": null}]}]},{"id": "6","pid": "2","name": "次二层级","type": "6","childNodeList": null}]}]}
]

相关文章:

java 查询树结构数据,无限层级树结构通用方法

1、数据库表数据 2、controller层TestTree简单测试 RestController RequestMapping("/test") public class testTreeController {Autowiredprivate TestTreeService testTreeService;GetMapping("/list")public List<TestTree> List(TestTree tree)…...

FreeCAD集成gmsh源码分析

目录 gmsh模块界面获取gmsh的版本执行gmsh网格划分gmsh模块界面 这个界面是用PySide来写的,PySide是QT的python绑定,具体代码在task_mesh_gmsh.py文件中。目前这个界面非常的简陋,没有对接gmsh稍微高级一点的功能。界面对应的事件处理是在gmshtools.py中。这里只分析“Gmsh …...

K8s 集群 IP 地址管理指南(K8s Cluster IP Address Management Guide)

K8s 集群 IP 地址管理指南 概述 你是否在小型初创公司或大型企业工作&#xff0c;并正在为公司评估 Kubernetes&#xff1f;你可能正在考虑运行十几个或更多的 Kubernetes (K8s) 集群。你期望每个集群支持几百个 K8s 节点&#xff0c;每个节点可能有 50 到 100 个 K8s Pod。这…...

Debye-Einstein-模型拟合比热容Python脚本

固体比热模型中的德拜模型和爱因斯坦模型是固体物理学中用于估算固体热容的两种重要原子振动模型。 爱因斯坦模型基于三种假设&#xff1a;1.晶格中的每一个原子都是三维量子谐振子&#xff1b;2.原子不互相作用&#xff1b;3.所有的原子都以相同的频率振动&#xff08;与德拜…...

OpenCV的图像分割

1、基本概念 图像分割是计算机视觉和图像处理中的一个关键步骤&#xff0c;它指的是将图像划分为多个区域或对象的过程。这些区域或对象在某种特性&#xff08;如颜色、形状、纹理或亮度等&#xff09;上是一致的或相似的&#xff0c;而在不同区域之间则存在明显的差异。图像分…...

【源码+文档+调试讲解】农产品研究报告管理系统

摘 要 农产品研究报告管理系统是一个旨在收集、整理、存储和分析农产品相关研究数据的综合性平台。农产品研究报告管理系统通常包含一个强大的数据库&#xff0c;它能够处理大量的研究数据&#xff0c;并对这些数据进行有效的管理和备份。农产品研究报告管理系统是现代农业科学…...

【STM32-学习笔记-7-】USART串口通信

文章目录 USART串口通信Ⅰ、硬件电路Ⅱ、常见的电平标准Ⅲ、串口参数及时序Ⅳ、STM32的USART简介数据帧起始位侦测数据采样波特率发生器 Ⅴ、USART函数介绍Ⅵ、USART_InitTypeDef结构体参数1、USART_BaudRate2、USART_WordLength3、USART_StopBits4、USART_Parity5、USART_Mode…...

高可用虚拟IP-keepalived

个人觉得华为云这个文档十分详细&#xff1a;使用虚拟IP和Keepalived搭建高可用Web集群_弹性云服务器 ECS_华为云 应用场景&#xff1a;虚拟IP技术。虚拟IP&#xff0c;就是一个未分配给真实主机的IP&#xff0c;也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个…...

AI多模态技术介绍:视觉语言模型(VLMs)指南

本文作者&#xff1a;AIGCmagic社区 刘一手 AI多模态全栈学习路线 在本文中&#xff0c;我们将探讨用于开发视觉语言模型&#xff08;Vision Language Models&#xff0c;以下简称VLMs&#xff09;的架构、评估策略和主流数据集&#xff0c;以及该领域的关键挑战和未来趋势。通…...

高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图

目录 高效工作流&#xff1a;用Mermaid绘制你的专属流程图 一、流程图的使用场景 1.1、流程图flowChart 1.2、使用场景 二、如何使用mermaid画出优雅的流程图 2.1、流程图添加图名 2.2、定义图类型与方向 2.3、节点形状定义 2.3.1、规定语法 2.3.2、不同节点案例 2.…...

uniApp通过xgplayer(西瓜播放器)接入视频实时监控

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…...

ws 配置 IngressRoute 和 http一样

ws 配置 IngressRoute 和 http一样 apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata:name: web-ws-ingressroutenamespace: starp spec:entryPoints:- webroutes:- match: Host(webws.we…...

IMX6ULL的IOMUXC寄存器和SNVS复用寄存器似乎都是对引脚指定复用功能的,那二者有何区别?

IMX6ULL 的 IOMUXC 和 SNVS&#xff08;Secure Non-Volatile Storage&#xff09;复用寄存器都是用于配置引脚功能的&#xff0c;但它们的作用范围、目的和使用场景存在明显区别。以下是它们的差异分析&#xff1a; 1. IOMUXC&#xff08;I/O Multiplexer Control&#xff09;寄…...

LabVIEW实现动态水球图的方法

水球图是一种直观展示百分比数据的图表&#xff0c;常用于数据监测与展示。LabVIEW 虽不直接支持水球图绘制&#xff0c;但可通过图片控件动态绘制波形&#xff0c;或借助 HTMLCSS 的 Web 控件实现。此外&#xff0c;还可以结合 Python 等第三方工具生成水球图&#xff0c;LabV…...

【江协STM32】11-2/3 W25Q64简介、软件SPI读写W25Q64

1. W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器&#xff0c;常应用于数据存储、字库存储、固件程序存储等场景存储介质&#xff1a;Nor Flash&#xff08;闪存&#xff09;时钟频率&#xff1a;80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)存储容…...

《自动驾驶与机器人中的SLAM技术》ch2:基础数学知识

目录 2.1 几何学 向量的内积和外积 旋转矩阵 旋转向量 四元数 李群和李代数 SO(3)上的 BCH 线性近似式 2.2 运动学 李群视角下的运动学 SO(3) t 上的运动学 线速度和加速度 扰动模型和雅可比矩阵 典型算例&#xff1a;对向量进行旋转 典型算例&#xff1a;旋转的复合 2.3 …...

算法日记2:洛谷p3853路标设置(二分答案)

一、题目&#xff1a; 二、解题思路&#xff1a; 2.1&#xff1a;首先&#xff0c;我们二分空旷指数 1、因为题目中要求我们求解最大值最小应该是属于第二类模型2.也就是说&#xff0c;当check()函数为true时候&#xff0c;说明这个空旷指数是成立的&#xff0c;对应的路标数…...

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构&#xff08;一&#xff09;远程管理系统&#xff08;二&#xff09;资源管理系统&#xff08;三&#xff09;SLA 管理系统&#xff08;四&#xff09;计费管理系统 二、安全与可靠性保障&#xff08;一&#xff09;数据安全防线&#xff08;…...

Blender常规设置

移动&#xff1a;Shift鼠标中键 旋转&#xff1a;鼠标中键 缩放&#xff1a;Ctrl鼠标中键...

c++ 中的容器 vector、deque 和 list 的区别

表格汇总&#xff1a; 容器存储结构随机访问性能中间插入/删除性能两端插入/删除性能内存管理特点迭代器类型适用场景vector连续存储的动态数组 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n)&#xff08;需要移动元素&#xff09;末尾&#xff1a; O ( 1 ) O(1) O(1)&#xff0c;头部…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...