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

Mybatis+Mysql 实现向下递归查询

介绍

说到递归查询,大家可以想到的技术实现方式主要如下几种:
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.lryc.cn/news/44413.html

相关文章:

  • python@调用系统命令行@os.system@subprocess@标准输入输出@sys.stdin@sys.stdout@input@print
  • 手握数据智能密钥,诸葛智能打开数字化经营“三重门”
  • C语言可以实现各种滤波算法
  • 使用Netty,当然也要了解它的连接闲置处理
  • 2、K-Planes
  • 张文海教授课题组在国际高水平期刊《Cerebral Cortex》发表研究成果
  • ffmpeg4.1 源码学习之-转封装
  • ChatGPT写作文章-快速使用ChatGPT不用注册方式
  • Nginx配置ip白名单(服务权限控制)
  • Vue 核心(二)
  • 犯罪现场还原虚拟vr训练平台突破各种教学限制
  • LeetCode 617. 合并二叉树 | C++语言版
  • Python量化交易08——利用Tushare获取日K数据
  • 30张精美可视化大屏,无需代码直接套用,解决你95%的大屏需求!
  • TCP网络事件模型的封装1.0
  • NC271.二叉搜索树的后序遍历序列
  • 研究fastdds v2.8.0 1之 基础模块
  • ElasticSearch系列 - SpringBoot整合ES:精确值查询 term
  • 关于async/await、promise和setTimeout执行顺序
  • 2023-03-31:如何计算字符串中不同的非空回文子序列个数?
  • D. The Number of Imposters(二分图染色)
  • 图片太大怎么改小kb?简单的图片压缩方法分享
  • 【python-leecode刷题】动态规划类问题----以53. 最大子数组和为例
  • Idea常用快捷键设置
  • 【新2023Q2模拟题JAVA】华为OD机试 - 分苹果
  • 【博学谷学习记录】超强总结,用心分享丨人工智能 自然语言处理 BERT、GPT、ELMO对比学习简记
  • 【嵌入式Bluetooth应用开发笔记】第四篇:初探蓝牙HOST及应用开发(持续更新ing)
  • GORM 基础 -- CRUD 接口
  • 为什么0代码自动化测试越来越受欢迎?一文2000字解析
  • cleanmymac最新2023版 mac清理软件CleanMyMac X4.12.5 中文版功能介绍