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)
到此为止,全部搞定