树节点递归删除--service层
@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层的更多相关文章
- MySQL 树节点递归遍历所以子节点
DELIMITER $$ DROP FUNCTION IF EXISTS `getChildList`$$ CREATE FUNCTION `getChildList`(rootId INT) RET ...
- 递归删除资源树 Ztree
前言 最近项目里有这么一个需求:现在有一个用Ztree编写的资源树,当删除资源树的某个节点时,则将此节点下面的所有节点全部删除,这里显然就用到了递归:若此节点被删除后无其它的兄弟节点了,我们还需要将其 ...
- 多层树级关系的json,递归删除空值的数据
data =[{ "name": "省", "children":[ { "name": "市区", ...
- 树(2)-----leetcode(层、深度、节点)
1.树的类实现: class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = N ...
- zTree实现删除树节点
zTree实现删除树节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</titl ...
- 在数据库级别还是在service层进行级联删除
在数据库配置级联删除的话,父表删除子表也删除.但是应该将维护代码放在一处,不要在service上删除父表,而在数据库层面级联删除子表,应该都在service层上进行删除.
- 【spring data jpa】使用spring data jpa时,关于service层一个方法中进行【删除】和【插入】两种操作在同一个事务内处理
场景: 现在有这么一个情况,就是在service中提供的一个方法是先将符合条件的数据全部删除,然后再将新的条件全部插入数据库中 这个场景需要保证service中执行两步 1.删除 2.插入 这两步自然 ...
- Winform递归绑定树节点
/// <summary> /// 绑定树节点 /// </summary> /// <param name="pid"></param& ...
- Winfom递归绑定树节点
/// <summary> /// 绑定树节点 /// </summary> /// <param name="pid"></param& ...
随机推荐
- BitmapFactory: 通过Bitmap的getWidth和getHeight方法获取到的尺寸与实际尺寸不符的问题
问题 今天无意中发现了一个问题,通过Bitmap的getWidth和getHeight方法获取到的图片尺寸与实际的尺寸(1920*1080)不一致,后来更进一步发现,把这张图片分别放在raw.draw ...
- 用户Ip地址和百度地图api接口获取用户地理位置(经纬度坐标,城市)
<?php //获取用户ip(外网ip 服务器上可以获取用户外网Ip 本机ip地址只能获取127.0.0.1) function getip(){ if(!empty($_SERVE ...
- 21Flutter Drawer侧边栏、以及侧边栏内容布局
Tabs.dart import 'package:flutter/material.dart'; import 'tabs/Home.dart'; import 'tabs/Category.dar ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_04-Eureka注册中心-将服务注册到Eureka Server
cms相当于客户端 配置客户端的信息 后面加逗号分隔开 50102表示向两台eureka服务上报服务,如果有一台死掉了 那么还可以上另外的一台去注册服务 直接把ip注册到eureka 启动类加注解 重 ...
- 阶段5 3.微服务项目【学成在线】_day08 课程图片管理 分布式文件系统_06-分布式文件系统研究-fastDFS安装及配置文件说明
3 fastDFS入门 3.1fastDFS安装与配置 3.1.1 导入虚拟机 对fastDFS的安装过程不要求学生掌握,可以直接导入老师提供虚拟机. 1.使用Vmware打开虚拟机配置文件“Cent ...
- java设置北京时间的时区
java设置北京时间的时区 解决方法: 设置北京时间的时区,消除时间差. TimeZone timeZone = TimeZone.getTimeZone("GMT+8"); ...
- 导出 VuePress构建的网站为 PDF
前言 学 Rust 也有一段时间了,网上也有不少官方文档的中文翻译版,但是似乎只有 Rust中文网站 文档一直是最新的,奈何并没有 PDF 供直接下载,是在是不太方便,为了方便阅读以及方便后续文档更新 ...
- C# using语句 中间出现exception后 using仍然会dispose
C# using语句,中间出现exception后,using仍然会dispose,因为: using语句 相当于 try-finally{dispose()}
- python迭代器、生成器、装饰器之迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式. 一般分为可迭代对象,迭代器,可迭代对象不一定是迭代器,但迭代器一定是可迭代对象 1.可以直接作用于for循环的数据类型 第一类:集合数据 ...
- VMware vSphere 6 序列号大全
经过测试ESXI6.5也可以使用. vSphere 6 Hypervisor HY0XH-D508H-081U8-JA2GH-CCUM2 4C4WK-8KH8L-H85J0-UHCNK-8CKQ8 ...