msyql + java递归构筑树形结构

1、为了提高效率和其他功能用起来方便,做了一个存储过程,代码如下

CREATE DEFINER=`root`@`%` FUNCTION `getConstructionRootId`(constructionId LONG) RETURNS varchar(1000) CHARSET utf8
BEGIN

    DECLARE rootId VARCHAR(1000);

		SELECT
			pv.id INTO rootId
		FROM
			(
			SELECT
				@id AS _id,(
				SELECT
					@id := construction_id 
				FROM
					pmc_uploadfile_version 
				WHERE
					id = @id 
				) AS parent_id 
			FROM
				( SELECT @id := constructionId ) tmp,
				pmc_uploadfile_version 
			WHERE
				@id <> 0 
			) tt
			INNER JOIN pmc_uploadfile_version pv 
			ON tt._id = pv.id and pv.construction_id = 0;

		IF rootId IS NULL THEN
			SET rootId = 0;
		END IF;
		
		RETURN rootId;
END

2、SQL语句选择所有的子目录如下

        select
            p.id,
            p.version_name,
            p.construction_id,
            p.level,
            p.ordernum,
            p.type_id,
            p.project_id
        from
            pmc_uploadfile_version p
        where FIND_IN_SET(id, getChildLst(0))
						and p.project_id = 1 
						and type_id = 2
        order by p.level, p.ordernum

SQL取出来的结构如下
在这里插入图片描述

3、在java中对取得数据进行封装,做成那种一层套一层的模式,工前端组件构筑树形结构使用
spring的service中的主方法

/**
     * 从根目录递归查询所有子目录
     *
     * @param pmcUploadfileVersionParam 上传文件的所属版本
     * @return 子目录集合
     */
    @Override
    public List<PmcUploadfileVersion> selectAllChildFromRoot(PmcUploadfileVersion pmcUploadfileVersionParam)
    {
        // 获取所有的目录
        List<PmcUploadfileVersion> pmcUploadFileVersionList =
                pmcUploadfileVersionMapper.selectAllChildFromRoot(pmcUploadfileVersionParam);

        // 从根目录开始正向递归查找
        for (PmcUploadfileVersion pmcUploadFileVersion : pmcUploadFileVersionList) {
            // 从顶层开始递归、父ID为0的为顶层目录
            if (pmcUploadFileVersion.getConstructionId().longValue() !=
                    pmcUploadfileVersionParam.getId().longValue()) {
                continue;
            }
            // 判断是否有直接子集
            if (hasChild(pmcUploadFileVersionList, pmcUploadFileVersion)) {
                recursionFn(pmcUploadFileVersionList, pmcUploadFileVersion);
            }
        }
        // 去除掉非顶级目录
        List<PmcUploadfileVersion> retPmcUploadFileVersionList = new ArrayList<PmcUploadfileVersion>();
        for (PmcUploadfileVersion pmcUploadFileVersion : pmcUploadFileVersionList) {
            if (pmcUploadFileVersion.getConstructionId().longValue() ==
                    pmcUploadfileVersionParam.getId().longValue()) {
                retPmcUploadFileVersionList.add(pmcUploadFileVersion);
            }
        }
        return retPmcUploadFileVersionList;
    }

递归用的主要方法

/**
     * 递归编辑子集
     *
     * @param pmcUploadfileVersionList 上传文件的所属版本的集合
     * @param pmcUploadfileVersion 上传文件的所属版本
     * @return 结果
     */
    private void recursionFn (List<PmcUploadfileVersion> pmcUploadfileVersionList,
                              PmcUploadfileVersion pmcUploadfileVersion) {

        // 判断是否有直接子集
        List<PmcUploadfileVersion> childList =
                getChildList(pmcUploadfileVersionList, pmcUploadfileVersion);
        pmcUploadfileVersion.setChildrenList(childList);

        for (PmcUploadfileVersion tChild : childList) {
            if (hasChild(pmcUploadfileVersionList, tChild)) {
                recursionFn(pmcUploadfileVersionList, tChild);
            }
        }
    }

获取自己的直接子集

/**
     * 获取自己的子集
     *
     * @param pmcUploadFileVersionList 上传文件的所属版本的集合
     * @param pmcUploadfileVersion 上传文件的所属版本
     * @return 结果
     */
    private List<PmcUploadfileVersion> getChildList(List<PmcUploadfileVersion> pmcUploadFileVersionList,
                                                    PmcUploadfileVersion pmcUploadfileVersion) {
        List<PmcUploadfileVersion> retList = new ArrayList<PmcUploadfileVersion>();
        // 查找子集
        for (PmcUploadfileVersion pmcUploadFileVersionTemp : pmcUploadFileVersionList) {
            if (pmcUploadFileVersionTemp.getConstructionId().longValue() ==
                    pmcUploadfileVersion.getId().longValue()) {
                retList.add(pmcUploadFileVersionTemp);
            }
        }
        return retList;
    }

判断自己是否有子集

    /**
     * 判断是够有子集
     *
     * @param pmcUploadFileVersionList 上传文件的所属版本的集合
     * @param pmcUploadfileVersion 上传文件的所属版本
     * @return 结果
     */
    private boolean hasChild(List<PmcUploadfileVersion> pmcUploadFileVersionList,
                             PmcUploadfileVersion pmcUploadfileVersion) {
        // 查找子集
        for (PmcUploadfileVersion pmcUploadFileVersionTemp : pmcUploadFileVersionList) {
            if (pmcUploadFileVersionTemp.getConstructionId().longValue() ==
                    pmcUploadfileVersion.getId().longValue()) {
                return true;
            }
        }
        return false;
    }

实体类中需要定义自己的集合列表
在这里插入图片描述
4、一切具备,用postman测试一下,看看效果
在这里插入图片描述
上面的ID是根目录的ID,如果想查全部,直接输入0(我的根目录的父级为0)

到此为止,全部搞定

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值