@Service
public class ContentCategoryServiceImpl extends BaseServiceImpl<ContentCategory> implements ContentCategoryService { @Override
public void deleteContentCategory(Long parentId, Long id) {
// 声明存放需要删除的节点的容器
List<Object> ids = new ArrayList<>(); // 把自己的id放到ids中
ids.add(id); // 使用递归获取所有需要删除的节点的id
this.getIds(id, ids); // 使用父类的方法,批量删除
super.deleteByIds(ids); // 查询兄弟节点,声明查询条件
ContentCategory param = new ContentCategory();
param.setParentId(parentId); // 执行查询
int count = super.queryCountByWhere(param); // 判断是否没有兄弟节点
if (count == 0) {
// 如果没有兄弟节点
ContentCategory parent = new ContentCategory(); parent.setId(parentId);
// 修改父节点的isParent为false
parent.setIsParent(false); // 执行修改
super.updateByIdSelective(parent); }
// 如果还有兄弟节点,神马都不做
} // 使用递归的方式查询所有的子节点的id
private void getIds(Long id, List<Object> ids) {
// 根据条件查询当前节点的所有的子节点
ContentCategory param = new ContentCategory();
param.setParentId(id);
List<ContentCategory> list = super.queryListByWhere(param); // 使用递归的方式,必须设置递归的停止条件,否则会一直自己调用自己,直到内存溢出
// 判断是否还有子节点
if (list.size() > 0) {
// 如果有子节点,遍历结果集
for (ContentCategory son : list) {
// 1.把子节点的id放到ids容器中
ids.add(son.getId());
// 2.执行递归,自己调用自己,查询子节点的子
this.getIds(son.getId(), ids);
}
}
} }

树节点递归删除--service层的更多相关文章

  1. MySQL 树节点递归遍历所以子节点

    DELIMITER $$ DROP FUNCTION IF EXISTS `getChildList`$$ CREATE FUNCTION `getChildList`(rootId INT) RET ...

  2. 递归删除资源树 Ztree

    前言 最近项目里有这么一个需求:现在有一个用Ztree编写的资源树,当删除资源树的某个节点时,则将此节点下面的所有节点全部删除,这里显然就用到了递归:若此节点被删除后无其它的兄弟节点了,我们还需要将其 ...

  3. 多层树级关系的json,递归删除空值的数据

    data =[{ "name": "省", "children":[ { "name": "市区", ...

  4. 树(2)-----leetcode(层、深度、节点)

    1.树的类实现: class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = N ...

  5. zTree实现删除树节点

    zTree实现删除树节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</titl ...

  6. 在数据库级别还是在service层进行级联删除

    在数据库配置级联删除的话,父表删除子表也删除.但是应该将维护代码放在一处,不要在service上删除父表,而在数据库层面级联删除子表,应该都在service层上进行删除.

  7. 【spring data jpa】使用spring data jpa时,关于service层一个方法中进行【删除】和【插入】两种操作在同一个事务内处理

    场景: 现在有这么一个情况,就是在service中提供的一个方法是先将符合条件的数据全部删除,然后再将新的条件全部插入数据库中 这个场景需要保证service中执行两步 1.删除 2.插入 这两步自然 ...

  8. Winform递归绑定树节点

    /// <summary> /// 绑定树节点 /// </summary> /// <param name="pid"></param& ...

  9. Winfom递归绑定树节点

    /// <summary> /// 绑定树节点 /// </summary> /// <param name="pid"></param& ...

随机推荐

  1. Web前端接入人机识别验证码---腾讯防水墙

    Web前端接入 1. 准备AppID 验证码接入需要先在管理后台中注册获取APPID和APPSECRET,注册步骤请参考 快速开始 2. 快速接入步骤 1.在Head的标签内最后加入以下代码引入验证J ...

  2. 【转载】 第四范式首席科学家杨强:AlphaGo的弱点及迁移学习的应对(附视频)

    原文地址: https://www.jiqizhixin.com/articles/2017-06-02-2 ============================================= ...

  3. Linux系列之——tomcat 的开机自启动

    --未验证 每次开机都要启动tomcat,非常麻烦:通过直接修改系统文件,实现tomcat自启动: 1. 修改脚本文件rc.local:vim /etc/rc.d/rc.local 这个脚本是使用者自 ...

  4. Vue.js学习之简介(待续)

    Vue.js 渐进式JavaScript 框架 易用:已经会了 HTML.CSS.JavaScript?即刻阅读指南开始构建应用! 灵活:不断繁荣的生态系统,可以在一个库和一套完整框架之间自如伸缩. ...

  5. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_14-网关-介绍网关及搭建网关工程

    4 Zuul网关 4.1 需求分析 网关的作用相当于一个过虑器.拦截器,它可以拦截多个系统的请求. 本章节要使用网关校验用户的身份是否合法. 4.2 Zuul介绍 什么是Zuul? Spring Cl ...

  6. Microsoft Visual Studio(VS)启动报安装过程中无法运行

    开机启动VS提示无法运行,很可能VS正在更新,可以等待几分钟更新完成,再次运行VS. 也可以把更新进程结束,进程名:VSIXAutoUpdate.exe

  7. Python网络编程之TCP套接字简单用法示例

    Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...

  8. Core Data 多表关联

    1.概念简介 coreData中存在复杂的数据关系时,一张表难以满足需求,此时就需要了解使用coreData多表的关联使用. 如 课程表 和 章节表 的关系:一个课程跟章节的对应关系是 一对多,单一个 ...

  9. Saltstack把网卡从ens160修改成eth0

    手动修改参考:https://www.cnblogs.com/minseo/p/8521873.html salt目录结构为 files/grub GRUB_TIMEOUT=5 GRUB_DISTRI ...

  10. 20190923-基于Python3的RobotFramework的配置是初次使用

    因为最近改自动化框架在网上找了很多框架,发现RobotFramework不错,但是网上的资料很杂,现在将自己配置框架的学习笔记分享 Python配置RobotFramework的seleniumlib ...