@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. ISO/IEC 9899:2011 条款6.4.4——常量

    6.4.4 常量 语法 1.constant: integer-constant floating-constant enumeration-constant character-constant 约 ...

  2. sqlalchemy连接 MySQL(转)

    from sqlalchemy import create_engine,Table,Column,Integer,String,MetaData,ForeignKey engine=create_e ...

  3. Pytho之Django

    Django工程目录讲解: manage.py脚本:用于管理Django站点 settings.py: 包含项目的所有配置参数 urls.py: URL根配置 wsgi.py: 内置runserver ...

  4. 《最长的一帧》 osg3.4 osgViewer::View::init() osgViewer::Viewer::getContexts()

    开始:osgViewer/ViewerBase.cpp   389行,startThreading()函数,启动线程   void ViewerBase::startThreading() { if ...

  5. SpringMVC拦截器工作流程图

  6. Swift学习 (一)

    以后会自己总结学习Swift的笔记与深化.希望能够帮助已经有Objective-C经验的开发者更快地学习Swift.我们一起学习,同时也品味到Swift的精妙之处. 结论放在开头:我认为Swift比O ...

  7. Spring Boot学习笔记——Spring Boot与ActiveMQ的集成

    Spring Boot对JMS(Java Message Service,Java消息服务)也提供了自动配置的支持,其主要支持的JMS实现有ActiveMQ.Artemis等.这里以ActiveMQ为 ...

  8. .Net Core 定时器Quartz

    最近因为项目需要用到了Quartz,下面简单记录一下. 一.首先需要安装Quartz. 二.定义一个执行的Job类,实现IJob接口,接口有一个方法Execute,用来执行定时任务的实现内容. pub ...

  9. python选课系统demo的小练习

    #简化选课系统代码:先登陆,然后判断身份并实例化,根据身份对应的类,让用户选择 class Manager: operate_dict=[ ('创造学生账号',"creat_student& ...

  10. 第一周--------Java的特性和优势

    --------我认可的1.跨平台性:   Java 的int 永远是32位,不像C++可能是16.,32 可能是根据编译器厂商规定的变化.这样的话,程序的移植就会变得困难2.安全性    Java ...