【精品】递归查询数据库 获取树形结构数据 通用方法

数据库表结构

在这里插入图片描述
在这里插入图片描述

实体类基类

@Getter
@Setter
@ToString
public class RecursionBean {

    /**
     * 编号
     */
    private Long id;

    /**
     * 父权限ID,根节点的父权限为空
     */
    @JsonIgnore
    private Long pid;

    private List<? extends RecursionBean> children;

    /**
     * 递归查询子节点
     *
     * @param root 根节点
     * @param list 所有节点
     * @return 根节点信息
     */
    private static <T extends RecursionBean> List<T> getChildren(T root, List<T> list) {
        final List<T> res = new ArrayList<>();
        for (T item : list) {
            if (Objects.equals(item.getPid(), root.getId())) {
                item.setChildren(getChildren(item, list));
                res.add(item);
            }
        }
        return res;
    }

    public static <T extends RecursionBean> List<T> getRecursionList(List<T> list) {
        final List<T> res = new ArrayList<>();
        for (T item : list) {
            if (item.getPid() == null) {
                item.setChildren(getChildren(item, list));
                res.add(item);
            }
        }
        return res;
    }

}

VO类

@Getter
@Setter
@ToString(callSuper = true)
public class PermissionVO extends RecursionBean {

    /**
     * 权限名称
     */
    private String title;

    /**
     * 权限编码
     */
    private String code;

    /**
     * 权限所对应的图标
     */
    private String icon;

    /**
     * 菜单类型: 1菜单   2按钮
     */
    private Integer type;

    /**
     * 权限所能访问的资源的路径
     */
    private String path;

    /**
     * 是否为外部链接
     */
    private Boolean external;


    /**
     * 删除标识:0删除  1未删除
     */
    private Boolean deleted;

}

调用代码

 @GetMapping("/v1/list")
@LogAnno(value = "权限分页", module = "Permission模块", opt = OptEnum.SELECT)
public ResultBean<List<PermissionVO>> list() {
    // 将Query对象转换成QueryWrapper对象
    QueryWrapper<Permission> queryWrapper = QueryWrapperUtil.query2wrapper(permissionQuery);
    List<Permission> permissionList =    permissionService.list(queryWrapper);

    final List<PermissionVO> permissionVOList = permissionConverter.permissionList2permissionVOList(permissionList);
    final List<PermissionVO> list = RecursionBean.getRecursionList(permissionVOList);
    System.out.println(JsonUtil.obj2string(list));

    return ResultBeanUtil.success(list);
}

结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

申请双软认证需要哪些材料?软件功能测试报告怎么获取?

“双软认证”是指软件产品评估和软件企业评估&#xff0c;其中需要软件测试报告。 企业申请双软认证除了获得软件企业和软件产品的认证资质&#xff0c;同时也是对企业知识产权的一种保护方式&#xff0c;更可以让企业享受国家提供给软件行业的税收优惠政策。 那么&#xff0c;…

奇舞周刊第522期:“Vite 又开始搞事情了!!!”

奇舞推荐 ■ ■ ■ Vite 又开始搞事情了&#xff01;&#xff01;&#xff01; Vite 的最新版本将引入一种名为 Rolldown 的新型打包工具。 unocss 究竟比 tailwindcss 快多少&#xff1f; 我们知道 unocss 很快&#xff0c;也许是目前最快的原子化 CSS 引擎 (没有之一)。 巧用…

Flink:使用 Faker 和 DataGen 生成测试数据

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

Linux 发布项目到OpenEuler虚拟机

后端&#xff1a;SpringBoot 前端&#xff1a;VUE3 操作系统&#xff1a;Linux 虚拟机&#xff1a;OpenEuler 发布项目是需要先关闭虚拟机上的防火墙 systemctl stop firewalld 一、运行后端项目到虚拟机 1、安装JDK软件包 查询Jdk是否已安装 dnf list installed | grep jd…

力扣每日一题 好子数组的最大分数 单调栈 双指针

Problem: 1793. 好子数组的最大分数 &#x1f496; 单调栈 思路 &#x1f468;‍&#x1f3eb; 参考题解 以当前高度为基准&#xff0c;寻找最大的宽度组成最大的矩形面积那就是要找左边第一个小于当前高度的下标left&#xff0c;再找右边第一个小于当前高度的下标right那宽…

Linux 磁盘的一生

注意&#xff1a;实验环境都是使用VMware模拟 ​ 磁盘接口类型这里vm中是SCSI&#xff0c;扩展sata,ide(有时间可以看看或者磁盘的历史) ​ 总结&#xff1a;磁盘从有到无—类似于建房子到可以住 ————————————————————————————————————…

【PHP + 代码审计】函数详解2.0

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

【计算机网络篇】物理层(4)信道的极限容量,信道复用技术

文章目录 &#x1f354;信道的极限容量&#x1f6f8;造成信号失真的主要因素⭐码元的传输速率 &#x1f6f8;奈氏准则&#x1f6f8;香农公式&#x1f388;练习 &#x1f5d2;️小结 &#x1f354;信道复用技术⭐常见的信道复用技术&#x1f388;频分复用FDM&#x1f388;时分复…

Python之进程池、阻塞模式、非阻塞模式、进程间的通信、queue

非阻塞模式 # 当需要创建的子进程数量不多时&#xff0c;可以直接利用multiprocessing中的Process动态成生多个进程 # 但如果是上百甚至上千个目标&#xff0c;手动的去创建进程的工作量巨大&#xff0c;此时就可以用到multiprocessing模块提供的Pool方法. # 初始化Poo1时&…

分享5款专注于实用简洁的工具软件

​ 有时候一些小工具&#xff0c;能给你带来一些意想不到的效果&#xff0c;我们来看看下面这5款工具&#xff0c;你又用过其中几款呢&#xff1f; 1. 高效操作利器——Quicker ​ Quicker是一款旨在提高操作效率的强大工具。通过简单的自定义设置&#xff0c;用户能够创建个…

幼儿教育管理系统|基于jsp 技术+ Mysql+Java的幼儿教育管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

C++中的Union: 内存与类型转换技巧

在C中&#xff0c;union是一种特殊的数据类型&#xff0c;允许在相同的内存位置存储不同类型的数据。union提供了一种高效地利用内存的方式&#xff0c;但同时也要求开发者更加小心地处理数据以避免类型错误。 1. 基本定义 union定义了一个可以存储多种类型但任意时刻只能存储…

未来国家的希望在实体经济 民众的希望在投资理财

2024年经济的车轮已经滚滚而来&#xff0c;在阳春三月这个希望无限的季节&#xff0c;香港贵金属交易商、香港金银贸易场AA类147号行员金田金业认为&#xff0c;我们国家的希望在于实体经济发展&#xff0c;而民众要实现个人财务自由&#xff0c;仅仅靠打工还不够&#xff0c;更…

C++ Qt开发:QUdpSocket实现组播通信

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的组播通信…

PyTorch二次反向传播报错

First StagenetF, netC = backbone_net(args, return_type=001xy)base_network = nn.Sequential(netF, netC)optimizer_f = optim.Adam(netF

leetcode(Hot100)——数组篇

1、两数之和 本题使用哈希法&#xff0c;用一个哈希Map保存数组的值以及对应下标&#xff0c;代码如下&#xff1a; class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer,Integer> map new HashMap<>();for(int i0; i<nums.length…

没有经验就开通抖店,你会遇到以下这些问题!2024抖店教程(新版)

我是王路飞。 没有经验的人去做抖店的话&#xff0c;都会遇到哪些问题呢&#xff1f; 大概率逃脱不开这些问题&#xff1a; 店铺的类型怎么选&#xff1f; 店铺的流量从哪来&#xff1f; 没有货源但又担心做无货源模式会被平台判定违规&#xff1b; 怎么才能快速把店铺做…

利用Google成功开发客户的15个方法!

做外贸的小伙伴们都知道Google是搜索开发客户比较重要的平台&#xff0c;基本上所有的客户都能在Google上找到蛛丝马迹。 今天小编给大家分享15个有关Google客户开发的方法&#xff0c;大家赶快Get起来! 01.产品名称importers importers可以用importer代替。不同的产品或者行…

数据库简介与MySQL编译安装

1数据库基础 什么是数据库 数据库&#xff08;Database&#xff09;是一个有组织的数据存储系统&#xff0c;用于有效地存储、检索、管理和维护数据。数据库系统允许用户以结构化的方式存储和操作大量数据&#xff0c;并提供了一种可靠的方法来管理和维护这些数据&#xff0c…

内网渗透学习-环境搭建

1、环境搭建测试 虚拟机网络环境配置&#xff0c;模拟外网和内网 主机操作系统网络内网ip外网ip物理主机window10vmnet8192.168.70.1攻击机kali Linuxvmnet8192.168.70.134域控主机win server 2008 r2vmnet0192.168.52.138域成员主机win server 2k3vmnet0192.168.52.141服务器…