树形表,自关联表查询技巧

news2025/7/10 3:56:06

方法一:部门表,部门表中除了自身主键id外,还有另一个字段parentId父id,可以一直递归下去

数据库表: 

 

菜单这样展示就需要我们在接口的返回值中,返回这样的层级数据:

[
  {
    "id": 1,
    "name": "股东会",
    "parentId": -1,
    "depPath": ".1",
    "enabled": true,
    "isParent": true,
    "children": [
      {
        "id": 2,
        "name": "董事会",
        "parentId": 1,
        "depPath": ".1.2",
        "enabled": true,
        "isParent": true,
        "children": [
          {
            "id": 3,
            "name": "总办",
            "parentId": 2,
            "depPath": ".1.2.3",
            "enabled": true,
            "isParent": true,
            "children": [
              {
                "id": 4,
                "name": "财务部",
                "parentId": 3,
                "depPath": ".1.2.3.4",
                "enabled": true,
                "isParent": false,
                "children": [],
                "result": null
              },
              {
                "id": 5,
                "name": "市场部",
                "parentId": 3,
                "depPath": ".1.2.3.5",
                "enabled": true,
                "isParent": true,
                "children": [
                  {
                    "id": 6,
                    "name": "华东市场部",
                    "parentId": 5,
                    "depPath": "1.2.3.5.6",
                    "enabled": true,
                    "isParent": true,
                    "children": [
                      {
                        "id": 8,
                        "name": "上海市场部",
                        "parentId": 6,
                        "depPath": "1.2.3.5.6.8",
                        "enabled": true,
                        "isParent": false,
                        "children": [],
                        "result": null
                      }
                    ],
                    "result": null
                  },
                  {
                    "id": 7,
                    "name": "华南市场部",
                    "parentId": 5,
                    "depPath": "1.2.3.5.7",
                    "enabled": true,
                    "isParent": false,
                    "children": [],
                    "result": null
                  },
                  {
                    "id": 9,
                    "name": "西北市场部",
                    "parentId": 5,
                    "depPath": ".1.2.3.5.9",
                    "enabled": true,
                    "isParent": true,
                    "children": [
                      {
                        "id": 10,
                        "name": "贵阳市场",
                        "parentId": 9,
                        "depPath": ".1.2.3.5.9.10",
                        "enabled": true,
                        "isParent": true,
                        "children": [
                          {
                            "id": 11,
                            "name": "乌当区市场",
                            "parentId": 10,
                            "depPath": ".1.2.3.5.9.10.11",
                            "enabled": true,
                            "isParent": false,
                            "children": [],
                            "result": null
                          }
                        ],
                        "result": null
                      }
                    ],
                    "result": null
                  }
                ],
                "result": null
              },
              {
                "id": 12,
                "name": "技术部",
                "parentId": 3,
                "depPath": ".1.2.3.12",
                "enabled": true,
                "isParent": false,
                "children": [],
                "result": null
              },
              {
                "id": 13,
                "name": "运维部",
                "parentId": 3,
                "depPath": ".1.2.3.13",
                "enabled": true,
                "isParent": true,
                "children": [
                  {
                    "id": 149,
                    "name": "测试部门1",
                    "parentId": 13,
                    "depPath": ".1.2.3.13.149",
                    "enabled": true,
                    "isParent": false,
                    "children": [],
                    "result": null
                  }
                ],
                "result": null
              }
            ],
            "result": null
          }
        ],
        "result": null
      }
    ],
    "result": null
  }
]

返回这样的数据:其中有个简单的方法

1: 修改数据库表对应的实体类,给实体类添加一个字段 children

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_department")
@ApiModel(value="Department对象", description="")
public class Department implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty(value = "部门名称")
    private String name;

    @ApiModelProperty(value = "父id")
    private Integer parentId;

    @ApiModelProperty(value = "路径")
    private String depPath;

    @ApiModelProperty(value = "是否启用")
    private Boolean enabled;

    @ApiModelProperty(value = "是否上级")
    private Boolean isParent;

    @ApiModelProperty(value = "子部门列表")
    @TableField(exist = false)
    private List<Department> children;

    @ApiModelProperty(value = "返回结果,存储过程使用")
    @TableField(exist = false)
    private Integer result;

}

2. 正常的写Controlelr,service,下面给出ServiceImpl后面的代码

ServiceImpl.java

这里-1是 顶级节点的parentId为-1

    /**
     * 获取所有部门
     * @return
     */
    @Override
    public List<Department> getAllDepartments() {
        return departmentMapper.getAllDepartments(-1);
    }

Mapper.java

    /**
     * 获取所有部门
     * @return
     */
    List<Department> getAllDepartments(Integer parentId);

Mapper.xml

定义一个返回的Map,在这个Map中,通过collection标签的 select 属性,来给这个集合赋值,每次赋值就再调用一下 getAllDepartments方法查询一次,携带的参数为第一次查询时候的主键id

    <!--获取所有部门-->
    <select id="getAllDepartments" resultMap="DepartmentWithChildren" parameterType="Integer">
        select
        <include refid="Base_Column_List" />
        from t_department
        where parentId = #{parentId}
    </select>


     <resultMap id="DepartmentWithChildren" type="com.example.pojo.Department" extends="BaseResultMap">
        <!--select 相当是拿到children,如何拿到值呢,那就再调用一下这个方法,传id-->
        <collection property="children" ofType="com.example.pojo.Department" select="com.example.mapper.DepartmentMapper.getAllDepartments" column="id">
        </collection>
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, name, parentId, depPath, enabled, isParent
    </sql>

 方法二: 通过sql关联查询

有空了再更新.....

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

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

相关文章

Mybatis-plus使用教程

注意点&#xff1a;我们在主启动类上需要扫描我们持久层文件下的所以接口 MapperScan("com.kuang.mapper") 配置日志 mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImplCRUD扩展 1.插入测试 //测试插入Testpublic void testInse…

java之《浅入了解异常》适合预习,复习

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《java练级之旅》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我…

就推荐 4 个 yyds 的开源项目

本期推荐开源项目目录&#xff1a;1. 2022 年黑色星期五精选项目2. 力推的 SwiftUI 教程3. 开源的高校微信小程序4. 上班摸鱼用的 IDEA 插件012022 年黑色星期五精选项目没错&#xff0c;这个开源项目叫做 Black Friday。这是一个优质开源项目精选开源项目&#xff0c;盘点了开…

制作一个简单HTML个人网页网页(HTML+CSS)大话西游之大圣娶亲电影网页设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

QT中的OpenGLWidget

1、在生成的UI中&#xff0c;通过控件OpenGL Widget来布置相应的空间&#xff08;后续讲通过promoted widget将此控件与派生的OpenGLWidget进行绑定&#xff09; 2、添加一个widget类&#xff0c;该类派生于 QOpenGLWidget, QOpenGLFunctions_*_*_Core&#xff08;*代表版本号…

rabbitmq配置windows authentication(windows account)

rabbitmq配置windows authentication(windows account开启插件配置文件创建一个不需要密码的账号&#xff0c;赋予administrator权限。用windows账号和密码登录rabbitmq加密明文密码创建密钥的文件,添加密钥字符串加密解密用户名密码配置加密后的字符串重启rabbitmq&#xff0c…

做好软件设计让你“事半功倍”

文章目录一、浅谈软件设计二、什么是好的软件设计&#xff1f;三、如何做好软件设计&#xff1f;3.1 设计原则3.1.1 SOLID原则3.1.2 开放-关闭原则&#xff08;Open–closed principle&#xff0c;OCP)3.1.3 里氏替换原则(Liskov Substitution Principle&#xff0c;LSP)3.1.4 …

数据结构与算法之让我们种下一棵字典树(Java/C++双语言实现)

⭐️前面的话⭐️ 本篇文章将介绍一种经常使用的数据结构——字典树&#xff0c;它又称Tire树&#xff0c;前缀树&#xff0c;字典树&#xff0c;顾名思义&#xff0c;是关于“字典”的一棵树。这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径&#xff0…

四川省部分地区经济发展水平的统计分析

四川省部分地区经济发展水平统计 摘 要 区域经济差异是经济发展过程中的一个普遍问题。区域经济的发展水平不仅影响到政府对各地的管理&#xff0c;也直接影响着社会的安定和人民的生活水平。而四川省区域经济差异更是表现明显&#xff0c;合理分析差异是政府行政管理的一个重…

系统设计-文本内容保存之XSS过滤

点击上方名片关注我&#xff0c;为你带来更多踩坑案例- 引言 -如果你是一个摸爬滚打几年的开发者&#xff0c;那么这个阶段&#xff0c;对系统设计的合理性绝对是衡量一个人水平的重要标准。一个好的设计不光能让你工作中避免很多麻烦&#xff0c;还能为你面试的时候增加很多谈…

【科学文献计量】RC.networkMultiLevel()中的参数解释

RC.networkMultiLevel中的参数解释 1 数据2 RC.networkMultiLevel()中的参数解释2.1 测试*modes参数2.2 测试nodeCount参数2.3 测试edgeWeight参数2.4 测试stemmer参数2.5 测试edgeAttribute参数2.6 测试nodeAttribute参数2.7 测试_networkTypeString参数1 数据 RC.networkMul…

QT学习笔记(四)——在QLabel显示的影像上画图形,并和影像同步放大缩小

实现在QLabel显示的影像上画图形&#xff0c;并和影像同步放大缩小 关于影像在QLabel的显示&#xff0c;如何随鼠标滚轮实现放大缩小&#xff0c;可以参考我的上一篇博客 QT学习笔记&#xff08;三&#xff09;——vs2019Qt实现打开影像并以鼠标为中心用滚轮控制图片缩放 本篇…

[每周一更]-(第22期):什么是gRPC?

gRPC 是Google发起的一个开源远程过程调用 系统。 该系统基于HTTP/2 协议传输&#xff0c;使用Protocol Buffers 作为接口描述语言。 其他功能&#xff1a; 认证 双向流 流控制 超时 最常见的应用场景是&#xff1a; 微服务框架下&#xff0c;多种语言服务之间的高效交互。 …

app发布前要做的几件事

最近把一个小东西做完了&#xff0c;想上架让大家用一下。在上架之前关于app需要做的几件事在此备忘一下。 1、app签名。 我用的是android studio 21.2.1版&#xff0c;签名跟之前的版本可能不同&#xff08;我之前用的是3.5&#xff09;&#xff0c;但也大同小异。21.2.1版的…

蓝桥杯刷题四

1.激光炸弹 二维前缀和的模板题 这里注意一下边长是R 矩形是(R-1)*(R-1) 并且坐标最大是5000 所以5001的轰炸就能炸完整个图了 所以要对这个做优化 不然会各种错误 #include <bits/stdc.h> using namespace std; const int N5e310; int sum[N][N]; int main() {int n…

学生个人网页设计作品 HTML+CSS+JavaScript仿小米商城(8页) 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计

临近期末&#xff0c;大一新生的各种考试和专业结课作业纷至沓来。什么高数啊、线代啊、C语言、网页设计等&#xff0c;简直让人头大。你还在为网页设计老师的作业要求感到头大&#xff1f;网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#x…

《人月神话》(The Mythical Man-Month)4概念一致性:专制、民主和系统设计(System Design)...

主题&#xff1a;概念一致性 &#xff08;Conceptual Integrity&#xff09;4. 专制、民主和系统设计(System Design&#xff09;Chapter 4. Aristocracy, Democracy, and System Design大教堂是艺术史上无与伦比的成就。它的原则既不乏味也不混乱……真正达到了风格上的极致&a…

【蓝桥杯选拔赛真题30】python计算倒数和 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python计算倒数和 一、题目要求 1、编程实现 2、输入输出 3、评分标准

【深度学习】手写数字识别

一、机器学习问题的求解步骤 学习 使用训练数据进行权重参数的学习 推理使用学习到的参数对输入的数据进行分类 二、MNIST数据集 2.1 load_mnist(flattenTrue, normalizeFalse) flattentrue 读入的图像一维numpy数组的形式保存 2.2 函数学习 def fromarray(obj, modeNone…

第六章《类的高级特性》第2节:包的创建和使用

在一个Java工程中,往往会包含很多类。为了方便工程管理,程序员总是希望能够把这些类按照功能分开存放。为了达到这个目的,Java语言允许开发者把不同的类放入不同的包中。所谓“包”就是存放类的容器,在一个包中可以存放多个类。 6.2.1创建包 程序员使用IDEA可以很轻松的创…