首页 > 编程语言 >Java-递归查询部门下所有子部门(包括本部门)

Java-递归查询部门下所有子部门(包括本部门)

时间:2024-12-19 20:42:57浏览次数:3  
标签:deptId Java 递归 subInstitutionIds List dept 部门 user id

Java-递归查询部门下所有子部门(包括本部门),会得到一个部门id的集合:List deptIds

具体代码如下:

//递归1
    public List<Long> queryAllSubInstitutionIds(Long institutionId) {
        List<Long> subInstitutionIds = new ArrayList<>();
        querySubInstitutionIds(institutionId, subInstitutionIds);
        return subInstitutionIds;
    }

    //递归2
    private void querySubInstitutionIds(Long institutionId, List<Long> subInstitutionIds) {
        // 添加当前机构ID
        subInstitutionIds.add(institutionId);
        // 获取当前机构的子机构
        List<Long> childrenIds = deptList(institutionId);
        // 递归查询子机构的子机构
        for (Long deptId : childrenIds) {
            querySubInstitutionIds(deptId, subInstitutionIds);
        }
    }
    //递归3
    private  List<Long> deptList(Long deptId){
        List<Long> list=baseMapper.getDeptList(deptId);
        return  list;
    }

其中:baseMapper.getDeptList()方法,查询数据库数据,代码如下:

/**
     * 查询机构下子机构
     * @param deptId
     * @return
     */
    List<Long> getDeptList(Long deptId);

sql如下:

select dept_id
        from sys_dept
        where del_flag = 0
          and status = 0
          and parent_id = #{deptId}

表结构如下:

image

拿到部门id list之后,代码如下:

1.接口方法:

 params.put("deptIds",deptIds);
            classUserList = baseMapper.getUserListByAllDept(params);

2.dao:

/**
     * 查询机构下所有子机构的学生
     * @param params
     * @return
     */
    List<ClassStudentListVO> getUserListByAllDept(Map<String, Object> params);

3.sql:

select
        A.user_id,
        A.user_name,
        A.nick_name,
        A.phonenumber,
        A.status,
        A.sex,
        B.dept_name,
        C.grade,
        C.school,
        C.lessons,
        C.lessons30
        from
        sys_user A
        left join sys_dept B ON A.dept_id=B.dept_id
        left join student_info C ON A.user_id=C.user_id
        <where>
            A.del_flag=0 and A.user_type=1 and A.status=0
            and B.del_flag=0
            and C.is_del=0
            <if test="deptIds != null">
                AND A.dept_id in
                <foreach collection="deptIds" index="index" item="item" open="(" separator="," close=")">
                    #{item}
                </foreach>
            </if>
            <if test="nickName != null and nickName.trim() != ''">
                AND A.nick_name like concat('%',#{nickName},'%')
            </if>
            <if test="sex != null and sex.trim() != ''">
                AND A.sex=#{sex}
            </if>
            <if test="phoneNumber != null and phoneNumber.trim() != ''">
                AND A.phonenumber=#{phoneNumber}
            </if>
        </where>

其中,主要sql如下:

 <if test="deptIds != null">
                AND A.dept_id in
                <foreach collection="deptIds" index="index" item="item" open="(" separator="," close=")">
                    #{item}
                </foreach>
            </if>

标签:deptId,Java,递归,subInstitutionIds,List,dept,部门,user,id
From: https://www.cnblogs.com/xiaoguo-java/p/18617891

相关文章

  • Java多线程
    多线程总结Java中的多线程是Java编程语言中的一个重要特性,它允许多个线程同时执行,从而提高程序的性能和响应能力。多线程在处理并发任务、优化资源利用率以及构建高性能应用程序方面发挥着关键作用。本文将详细介绍Java中的多线程,包括其基本概念、线程的创建与管理、线程同步、并......
  • Java并发编程(并发安全)
    并发编程中两个关键问题:线程之间如何通信(隐式进行,对程序员完全透明)以及如何同步线程之间的通信由JMM(java内存模型)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见,抽象来说共享变量存储在主内存,每个线程有一个私有的本地内存,里面存放了该线程读/写共享变量的副本就......
  • ITC228 - Programming in Java
    SubjectOutlineITC228-ProgramminginJavaCharlesSturtUniversity-TEQSAProviderIdentification:PRV12018(AustralianUniversity).CRICOSProvider:00005FPage2of28thatyouseekoursupportandguidanceifyouarehavinganydifficultieswiththi......
  • Java设计模式 —— 【结构型模式】桥接模式详解
    前言现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。首先我们看看用继承来实现:我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不......
  • 洛谷Java写 P5727冰雹猜想
    题目再现:        给出一个正整数n,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘3 再加1,否则除以2。经过若干次循环后,最终都会回到11。经过验证很大的数字(7*10^11)都可以按照这样的方式比变成 11,所以被称为“冰雹猜想”。例如当n是20,变化的过程是......
  • Java多线程第一篇-认识多线程
    文章目录进程和线程概念继承Thread重写run方法实现Runnable重写run方法(解耦合)通过匿名内部类lambda表达式线程的常见的属性(方法)Id(getId)名称(getName)是否后台线程(isDaemon)是否存活(isAlive)进程和线程概念进程(process):进程是操作系统资源分配的基本单位,操作系统......
  • java集合-Map HashMap 源码解析
    hashMap简介HashMap是基于哈希表实现的,每一个元素是一个key-value对,无序,不可重复。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。has......
  • Java内卷加剧,死磕八股还有用吗?
    最近小伙伴在我后台留言是这样的:现在就这光景,不比以前,会个CRUD就有人要,即使大部分公司依然只需要做CRUD的事情......现在去面试,只会CRUD还要被吐槽:面试造火箭,工作拧螺丝,就是现在互联网最真实的写照。很多程序员都是死磕八股文,以应对面试。这种情况无可厚非,但其实最重要......
  • 一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?
    一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?这个问题也引发了我的一些思考,可能很多人会说,“作为高级工程师,基础得过硬、得熟练掌握一门编程语言、至少看过一个优秀开源项目的源代码、有过高并发/性能优化的工作经验、沟通能力强等等”。上面这些都很对,这些......
  • spring boot使用Jwt令牌时出现 java.lang.NoClassDefFoundError: javax/xml/bind/Data
    问题根源    在Java9及更高版本中,Java平台经历了模块化系统(Jigsaw项目)的重大变化。作为这一变化的一部分,某些API被移出了默认的JDK发行版,其中包括JAXB(JavaArchitectureforXMLBinding)API。因此,在使用这些被移除的API时,如果应用程序或库没有适当地包......