Java递归查询树形结构(详解)

news2024/7/4 5:47:02

一.数据准备

数据库表结构如下所示,

INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (1, 0, '合伙企业');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (2, 0, '有限公司');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (3, 0, '股份有限公司');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (4, 0, '政府');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (5, 0, '行政与事业单位');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (6, 0, '协会');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (7, 0, '公益机构');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (101, 1, '有限合伙');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (102, 1, '普通合伙');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (201, 2, '一人有限公司');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (202, 2, '合资公司');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (301, 3, '上市股份公司');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (302, 3, '非上市股份公司');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (401, 4, '党办机构');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (402, 4, '中央政府');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (403, 4, '省级政府');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (404, 4, '市级政府');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (405, 4, '县区级政府');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (406, 4, '乡镇政府');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (501, 5, '行政机关');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (502, 5, '事业单位');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (601, 6, '行业协会');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (602, 6, '社会团体');
INSERT INTO `jg_user`.`com_type`(`type_id`, `parent_id`, `type_name`) VALUES (701, 7, '公益机构');
 

二.控制层代码编写

    @Log(title = "查询机构类型树", businessType = BusinessType.OTHER)
    @PostMapping("/selectComTypeTrees")
    public AjaxResult selectComTypeTrees(@RequestBody ComType comType) {
        AjaxResult ajax = AjaxResult.success();
        ajax.put("comTypeTrees", comMainService.selectComTypeTrees(comType));
        return ajax;
    }

三.业务层代码编写

@Override
    public List<ComType> selectComTypeTrees(ComType comType) {
        List<ComType> comTypeList = comMainMapper.selectComTypeTrees(comType);

        List<ComType> collect = comTypeList.stream()
                .filter(item -> item.getParentId() == 0)
                .map(item -> {
                    item.setChildList(getChildren(item, comTypeList));
                    return item;
                })
                .collect(Collectors.toList());
        return collect.size() == 0 ? comTypeList : collect;

    }


    public static List<ComType> getChildren(ComType comType, List<ComType> comTypeList) {
        List<ComType> collect = comTypeList.stream()
                .filter(item -> item.getParentId().equals(comType.getTypeId()))
                .map(item -> {
                    item.setChildList(getChildren(item, comTypeList));
                    return item;
                })
                .collect(Collectors.toList());
        return collect;
    }

四.数据库层代买编写

 <resultMap type="com.ruoyi.user.domain.ComType" id="ComTypeResult">
        <result property="typeId"    column="type_id"    />
        <result property="parentId"    column="parent_id"    />
        <result property="typeName"    column="type_name"    />
    </resultMap>
    <select id="selectComTypeTrees" parameterType="com.ruoyi.user.domain.ComType" resultMap="ComTypeResult">
        select type_id,parent_id,type_name from com_type
        <where>
            <if test="parentId != null and parentId != '' "> and parent_id = #{parentId}</if>
        </where>
    </select>

五.测试

http://localhost:8080/user/com/selectComTypeTrees

入参:

{
    "parentId": 0
}

出参:

{
	"msg": "操作成功",
	"code": 200,
	"comTypeTrees": [
		{
			"typeId": 1,
			"parentId": 0,
			"typeName": "合伙企业",
			"childList": [
				{
					"typeId": 101,
					"parentId": 1,
					"typeName": "有限合伙",
					"childList": [
						{
							"typeId": 101001,
							"parentId": 101,
							"typeName": "测试三级菜单",
							"childList": []
						}
					]
				},
				{
					"typeId": 102,
					"parentId": 1,
					"typeName": "普通合伙",
					"childList": []
				}
			]
		},
		{
			"typeId": 2,
			"parentId": 0,
			"typeName": "有限公司",
			"childList": [
				{
					"typeId": 201,
					"parentId": 2,
					"typeName": "一人有限公司",
					"childList": []
				},
				{
					"typeId": 202,
					"parentId": 2,
					"typeName": "合资公司",
					"childList": []
				}
			]
		},
		{
			"typeId": 3,
			"parentId": 0,
			"typeName": "股份有限公司",
			"childList": [
				{
					"typeId": 301,
					"parentId": 3,
					"typeName": "上市股份公司",
					"childList": []
				},
				{
					"typeId": 302,
					"parentId": 3,
					"typeName": "非上市股份公司",
					"childList": []
				}
			]
		},
		{
			"typeId": 4,
			"parentId": 0,
			"typeName": "政府",
			"childList": [
				{
					"typeId": 401,
					"parentId": 4,
					"typeName": "党办机构",
					"childList": []
				},
				{
					"typeId": 402,
					"parentId": 4,
					"typeName": "中央政府",
					"childList": []
				},
				{
					"typeId": 403,
					"parentId": 4,
					"typeName": "省级政府",
					"childList": []
				},
				{
					"typeId": 404,
					"parentId": 4,
					"typeName": "市级政府",
					"childList": []
				},
				{
					"typeId": 405,
					"parentId": 4,
					"typeName": "县区级政府",
					"childList": []
				},
				{
					"typeId": 406,
					"parentId": 4,
					"typeName": "乡镇政府",
					"childList": []
				}
			]
		},
		{
			"typeId": 5,
			"parentId": 0,
			"typeName": "行政与事业单位",
			"childList": [
				{
					"typeId": 501,
					"parentId": 5,
					"typeName": "行政机关",
					"childList": []
				},
				{
					"typeId": 502,
					"parentId": 5,
					"typeName": "事业单位",
					"childList": []
				}
			]
		},
		{
			"typeId": 6,
			"parentId": 0,
			"typeName": "协会",
			"childList": [
				{
					"typeId": 601,
					"parentId": 6,
					"typeName": "行业协会",
					"childList": []
				},
				{
					"typeId": 602,
					"parentId": 6,
					"typeName": "社会团体",
					"childList": []
				}
			]
		},
		{
			"typeId": 7,
			"parentId": 0,
			"typeName": "公益机构",
			"childList": [
				{
					"typeId": 701,
					"parentId": 7,
					"typeName": "公益机构",
					"childList": []
				}
			]
		}
	]
}

尽自己的一些绵薄之力,希望对大家有所帮助,谢谢!^_^

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣(LeetCode)878. 第 N 个神奇数字(C++)

二分查找数论 数论知识——辗转相除法、容斥原理。 辗转相除求最大公约数&#xff0c;两数相乘除以最大公约数&#xff0c;就是最小公倍数。 容斥原理求最多不重复元素&#xff0c;最大不重复面积。 <小学数奥> 从数据范围里&#xff0c;用容斥原理找 a/ba/ba/b 的倍数个…

Pytorch 下 TensorboardX 使用

这里引用一下在其他地方看到的一些话&#xff1a; tensorboard做为Tensorflow中强大的可视化工具&#xff0c;已经被普遍使用。 但针对其余框架&#xff0c;例如Pytorch&#xff0c;以前一直没有这么好的可视化工具可用&#xff0c;PyTorch框架自己的可视化工具是Visdom&…

实验九 数据微积分与方程数值求解(matlab)

实验九 数据微积分与方程数值求解 1.1实验目的 1.2实验内容 1.3流程图 1.4程序清单 1.5运行结果及分析 1.6实验的收获与体会 1.1实验目的 1&#xff0c;掌握求数值导数和数值积分的方法&#xff1b; 2&#xff0c;掌握代数方程数组求解的方法&#xff1b; 3&a…

【Mysql】Centos 7.6安装Mysql8

这里centos为阿里云默认镜像。 一、卸载历史历史版本 1、检查是否有服务启动 # service mysqld status 2、停止mysql服务 # service mysqld stop 3、查看mysql历史安装组件 # rpm -qa|grep mysqlmysql-libs-5.1.71-1.el6.x86_64 4、卸载组件 # rpm -e --nodeps mysql…

2022世界VR产业大会圆满收官,酷雷曼惊艳亮相!

11月14日&#xff0c;由工业和信息化部、江西省人民政府联合主办的全球VR领域规模最大、规格最高、影响最广的年度盛会——2022世界VR产业大会在江西南昌圆满落下帷幕。 本次大会得到了党中央、国务院的高度重视&#xff0c;国务委员王勇出席大会开幕式并讲话&#xff1b;大会邀…

【转】DNS隧道检测特征

原文链接&#xff1a;DNS隧道检测特征总结 - 知乎 一、摘要 企业内网环境中&#xff0c;DNS协议是必不可少的网络通信协议之一&#xff0c;为了访问互联网和内网资源&#xff0c;DNS提供域名解析服务&#xff0c;将域名和IP地址进行转换。网络设备和边界防护设备在一般的情况…

C++:内存管理:C++内存管理详解

C语言内存管理是指&#xff1a;对系统的分配、创建、使用这一系列操作。在内存管理中&#xff0c;由于是操作系统内存&#xff0c;使用不当会造成很麻烦的后果。本文将从系统内存的分配、创建出发&#xff0c;并且结合例子来说明内存管理不当会造成的结果以及解决方案。 一&am…

【Spring】Spring AOP的实现原理

目录 什么是AOP AOP的作用 AOP的优点 AOP框架 Spring AOP AspectJ 术语 1.Target ——目标类 2.Joinpoint ——连接点 3.Pointcut——切入点 4.Advice——通知/增强 5.Weaving——植入 6.Proxy——代理类 7.Aspect——切面 底层逻辑 开发流程 1.导入依…

八、手把手教你搭建SpringCloudAlibaba之Sentinel服务降级之慢调用

SpringCloud Alibaba全集文章目录&#xff1a; 零、手把手教你搭建SpringCloudAlibaba项目 一、手把手教你搭建SpringCloud Alibaba之生产者与消费者 二、手把手教你搭建SpringCloudAlibaba之Nacos服务注册中心 三、手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心 …

贪心算法应用

1. 算法思想 贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 即选择每一阶段的局部最优&#xff0c;从而达到全局最优。 2. 最大自序和 题目描述 题目链接 给你一个整数数组 n…

用Servlet 编写hello world

第一次接触 Servlet&#xff0c;使用 Servlet 编写代码并配合 Tomcat 在浏览器中展示代码效果&#xff0c;也算是自己这么长时间学习java的一次飞升吧。 本文总结了六步使用 Servlet 编写 helloworld步骤&#xff0c;希望给初学Servlet的同学一些帮助。 0、准备工作 1&#xff…

Python 随机函数random详解

介绍这7个随机数的方法应用&#xff1a; 1、random.random&#xff08;&#xff09;查看源码 说明&#xff1a;用于生成一个0到1的随机符点数: 0 < x < 1.0 import random for i in range(10):print(random.random()) 2、random.uniform&#xff08;&#xff09;查看源码…

深度学习(14)—— 关于Tensorboard

深度学习&#xff08;14&#xff09;—— 关于Tensorboard 文章目录深度学习&#xff08;14&#xff09;—— 关于Tensorboard前言1. “一参数一图”2.“多参数一图”3. “一栏一图”4. “一栏多图”在模型训练过程中loss和acc都会发生变化&#xff0c;常常需要记录这些值&…

Spring Security(2)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 前面已经把需要的环境准备好了&#xff0c;包括数据库和SQL语句&#xff0c;现在再来写代码。至于安装MySQL什么的就跳过去了&#xff0c;娘度子里面一大把。 先…

保护Excel表格的4种常用方法

今天来说说&#xff0c;根据不同需求&#xff0c;我们可以给Excel表格设置保护的4种常用方法&#xff0c;记得保存收藏&#xff0c;总有一个适合你。 方法一&#xff1a; 如果不想Excel表格被他人随意打开&#xff0c;可以设置“打开密码”&#xff0c;这样只有输入设置的密码…

OpenSergo 流量路由:从场景到标准化的探索

流量路由&#xff0c;顾名思义就是将具有某些属性特征的流量&#xff0c;路由到指定的目标。流量路由是流量治理中重要的一环&#xff0c;多个路由如同流水线一样&#xff0c;形成一条路由链&#xff0c;从所有的地址表中筛选出最终目的地址集合&#xff0c;再通过负载均衡策略…

git ssh permission denied解决办法

git ssh permission denied解决办法 1. SSH配置 参考链接 SSH配置文档 2. ssh报错(permission denied) 解决方式&#xff1a; 找到git安装目录 进入etc/ssh文件夹内&#xff0c;找到ssh_config文件&#xff0c;在# Added by git-extra后面添加t替换代码具体参考下面图片 H…

2022强网拟态pwn-store

2022强网拟态pwn-store 这是一个综合题&#xff0c;io链接的构造&#xff0c;orw的系统位数的限制 首先是这个沙箱&#xff0c;64位只有r和w&#xff0c;一开始看的时候很纳闷多了32位的限制&#xff0c;64位还没有o&#xff0c;查了一下才知道这样的seccomp-tools是以64位的…

Design Compiler工具学习笔记(4)

目录 引言 知识储备 实际操作 设计源码 Vivado2018.3仿真 VCS2016仿真 Tcl脚本 约束脚本 MY_TOP.tcl 运行脚本 RUN.tcl 引言 本篇继续学习 DC的基本使用。本篇主要学习 DC 需要的环境约束。 前文链接&#xff1a; Design Compiler工具学习笔记&#xff08;1&#x…

【苹果推iMessage位置推相册共享推送】软件安装上传到appstore都是需要的Activity

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…