Mybatis+Mysql 实现向下递归查询

news/2024/11/24 9:39:20/

介绍

说到递归查询,大家可以想到的技术实现方式主要如下几种:
1、各种主流应用开发语言本身通过算法实现
2、各种数据库引擎自身提供的算法实现

本文提到主要是针对第二种和第一种的结合

主要技术栈

1、ORM:Mybatis
2、DB:MySQL
3、开发语言:Java

代码实现示例

方式一、Mybatis Mapper类实现代码示例如下


// dept_employee  员工和部门的关系表
// dept 部门信息表
// 根据员工编号查询其直属部门的所有下级部门节点
@Select({"<script>","with recursive child_dept as\n" +"(\n" +"select id, code,name,name as dept_structure\n" +"from dept\n" +"where id in (\n" +"select DISTINCT dept_id from dept_employee\n" +"where employee_id= #{employeeId} " +"<when test='type!=null'>","and type=#{type}\n" +"</when>"+")\n" +"union\n" +"select a.id,a.code ,a.name, concat(b.dept_structure, ' > ', a.name) as dept_structure\n" +"from child_dept as b\n" +"join dept as a on b.code=a.parent_code\n" +")\n" +"select DISTINCT id from child_dept;\t","</script>"})List<Long> queryAllChildDeptByEmployeeId(@Param("employeeId") Long employeeId,@Param("type") String type);

方式二、Mybatis+存储过程示例如下:

    // Mybatis Mapper类调用存储过程@Select("call queryAllChildDeptByEmployeeId(#{employeeId},#{type})")@Options(statementType = StatementType.CALLABLE)List<Long> queryAllChildDeptByEmployeeId(@Param("employeeId") Long employeeId, String type);
//存储过程示例
CREATE DEFINER=`test`@`%` PROCEDURE `queryAllChildDeptByEmployeeId`(IN employeeId bigint,IN type VARCHAR(10))
BEGIN
if type is  null or type ='' THENwith recursive child_dept as(select id, code,name,name as dept_structurefrom deptwhere id in (select DISTINCT dept_id from dept_employeewhere employee_id= employeeId )unionselect a.id,a.code ,a.name, concat(b.dept_structure, ' > ', a.name) as dept_structurefrom child_dept as bjoin dept as a on b.code=a.parent_code)select DISTINCT id from child_dept;
ELSEwith recursive child_dept as(select id, code,name,name as dept_structurefrom deptwhere id in (select DISTINCT dept_id from dept_employeewhere employee_id= employeeId and type=type)unionselect a.id,a.code ,a.name, concat(b.dept_structure, ' > ', a.name) as dept_structurefrom child_dept as bjoin dept as a on b.code=a.parent_code)select DISTINCT id from child_dept;	
END IF;										
END

踩坑介绍

以上实现方式涉及到了MySQL的with as 语法,此实现方式必须给予MySQL 8.0.x版本,5.x.x版本不支持,

解决方案:
1、升级数据库版本为8.x版本
2、采用5.x版本语法FIND_IN_SET,如下代码示例

SELECT au.id, au.name, au.pidFROM (SELECT * FROM dept WHERE pid IS NOT NULL) au,(SELECT @pid := '1002,1005') pdWHERE FIND_IN_SET(pid, @pid) > 0 and @pid := concat(@pid, ',', id)
UNION
SELECT id, name, pidFROM deptWHERE FIND_IN_SET(id, @pid) > 0ORDER BY id;  

3、采用应用开发语言实现,如Java代码实现


http://www.ppmy.cn/news/36694.html

相关文章

服务器版RstudioServer安装与配置详细教程

Docker部署Rstudio server 背景&#xff1a;如果您想在服务器上运行RstudioServer&#xff0c;可以按照如下方法进行操作&#xff0c;笔者测试时使用腾讯云服务器&#xff08;系统centos7&#xff09;&#xff0c;需要在管理员权限下运行 Rstudio 官方提供了使用不同 R 版本的 …

Apache Camel

目录儿一、简介二、核心总结一、简介 Camel is an Open Source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. Camel 是一个开源的集成框架&#xff0c;能够让开发者快速、轻松地整合/集成不同的应…

华为OD机试用java实现 -【最多获得的短信条数】(2023-Q1 新题)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:最多获得的短信条数 题目 某…

张文海教授课题组在国际高水平期刊《Cerebral Cortex》发表研究成果

调节悲伤情绪对于维持伴侣间的浪漫关系至关重要。人际情绪调节策略包括情感参与&#xff08;AE&#xff09;和认知参与&#xff08;CE&#xff09;&#xff0c;这两种策略在浪漫关系中效用如何&#xff1f;它们是如何通过情感纽带调节伴侣情绪的&#xff1f;其背后的脑际神经互…

将 ChatGPT 与 实时聊天插件结合的终极指南

人工智能技术是聊天营销人员的福音&#xff0c;而ChatGPT是这场革命的突破性新成员。人工智能工具可以帮助显着改善您的营销工作&#xff0c;从创建更多自定义对话到节省客户支持响应的大量时间。事实上&#xff0c;你可以通过几个简单的步骤将ChatGPT与您的实时聊天插件结合起…

信号覆盖 蓝桥杯模拟

信号覆盖&#xff08;暴力模拟&#xff09; ❓️问题描述 小蓝负责一块区域的信号塔安装&#xff0c;整块区域是一个长方形区域&#xff0c;建立坐标轴后&#xff0c;西南角坐标为(0, 0)&#xff0c; 东南角坐标为(W, 0)&#xff0c; 西北角坐标为(0, H)&#xff0c; 东北角坐标…

从零开始学Python第10课:常用数据结构之元组

前面的两节课&#xff0c;我们为大家讲解了 Python 中的列表&#xff0c;它是一种容器型的数据类型&#xff0c;通过列表类型的变量&#xff0c;我们可以保存多个数据并通过循环实现对数据的批量操作。当然&#xff0c;Python 中还有其他容器型的数据类型&#xff0c;接下来我们…

异步流程控制 遍历篇filter

文章目录基础方法arrayEachIndexValuebaseEachIndexValuesymbolEachIndexValuecompacttimesSync异步遍历filterfilterLimitfilterSeries基础方法 arrayEachIndexValue function arrayEachIndexValue(array, iterator, createCallback) {var value;var index -1;var size ar…