java递归查询节点数据(级联选择器数据)
方法一(java递归)
@Resource
private CourseCategoryMapper courseCategoryMapper;
/**
* 根据父节点id查询子节点数据
*
* @return 子节点数据
*/
@Override
public List<CourseCategoryTreeDto> queryTreeNodesById2(String id) {
//查询所有
List<CourseCategory> courseCategoryList = courseCategoryMapper.selectList(null);
//将数据转dto
List<CourseCategoryTreeDto> collect = courseCategoryList.stream().map(item -> {
//创建dto对象封装数据
CourseCategoryTreeDto courseCategoryTreeDto = new CourseCategoryTreeDto();
//拷贝数据
BeanUtils.copyProperties(item, courseCategoryTreeDto);
return courseCategoryTreeDto;
}).collect(Collectors.toList());
//创建节点作为父节点
CourseCategoryTreeDto courseCategoryTreeDto = new CourseCategoryTreeDto();
courseCategoryTreeDto.setId(id);
//调用方法递归封装数据并返回子节点数据
return selectRecursionTreeNode(courseCategoryTreeDto, collect).getChildrenTreeNodes();
}
/**
* 递归查询当前节点及子节点数据
*
* @param courseCategoryTreeDto 节点
* @param allList 全部数据
* @return 当前节点及子节点数据
*/
private CourseCategoryTreeDto selectRecursionTreeNode(CourseCategoryTreeDto courseCategoryTreeDto, List<CourseCategoryTreeDto> allList) {
//遍历所有数据找出子节点
for (CourseCategoryTreeDto item : allList) {
//找出当前节点子节点
if (item.getParentid().equals(courseCategoryTreeDto.getId())) {
//初始化,避免NullPointerException
if (courseCategoryTreeDto.getChildrenTreeNodes() == null) {
courseCategoryTreeDto.setChildrenTreeNodes(new ArrayList<>());
}
//将此节点及其子节点数据加入父节点
courseCategoryTreeDto.getChildrenTreeNodes().add(selectRecursionTreeNode(item, allList));
}
}
//返回将此节点及其子节点数据加入父节点
return courseCategoryTreeDto;
}
方法二(数据库递归)
Mapper
List<CourseCategoryTreeDto> queryTreeNodes(String id);
XML
<select id="queryTreeNodes" parameterType="string" resultType="com.xuecheng.content.model.dto.CourseCategoryTreeDto">
with recursive t1 as (
select course_category.* from course_category where id=#{id}
union all
select course_category.* from course_category inner join t1 on t1.id=course_category.parentid
)
select * from t1 order by id;
</select>
Service
@Resource
private CourseCategoryMapper courseCategoryMapper;
@Override
public List<CourseCategoryTreeDto> queryTreeNodesById(String id) {
List<CourseCategoryTreeDto> list = courseCategoryMapper.queryTreeNodes(id);
Map<String, CourseCategoryTreeDto> dtoMap = list.stream().filter(item -> !Objects.equals(item.getId(), id)).collect(Collectors.toMap(CourseCategory::getId, value -> value));
//创建最终封装数据对象
ArrayList<CourseCategoryTreeDto> courseCategoryTree = new ArrayList<>();
list.stream().filter(item -> !Objects.equals(item.getId(), id)).forEach(item -> {
//找出一级节点对象
if (item.getParentid().equals(id)) {
courseCategoryTree.add(item);
}
//找出当前节点父节点对象
CourseCategoryTreeDto courseCategoryTreeDto = dtoMap.get(item.getParentid());
if (courseCategoryTreeDto != null) {
//有父节点,判断子节点是否为空
if (courseCategoryTreeDto.getChildrenTreeNodes() == null) {
courseCategoryTreeDto.setChildrenTreeNodes(new ArrayList<>());
}
//将当前节点加入父节点
}
});
return courseCategoryTree;
}
方法三(Stream流)
public List<Category> listMemuTree() {
//查询所有
List<Category> categoryAll = this.list();
return categoryAll.stream()
//找出所有一级分类
.filter(category -> category.getParentCid() == 0)
//设置一级分类子节点
.map(category -> {
List<Category> children = getChildren(category, categoryAll);
category.setChildren(children.size() > 0 ? children : null);
return category;
})
//排序
.sorted(Comparator.comparingInt(e -> (e.getSort() == null ? 0 : e.getSort())))
.collect(Collectors.toList());
}
/**
* 查询当前节点子节点
* @param category 当前结点
* @param all 所有结点
* @return
*/
private List<Category> getChildren(Category category, List<Category> all) {
return all.stream()
.filter(item -> Objects.equals(item.getParentCid(), category.getCatId()))
.map(item -> {
List<Category> children = getChildren(item, all);
item.setChildren(children.size() > 0 ? children : null);
return item;
}).sorted(Comparator.comparingInt(e -> (e.getSort() == null ? 0 : e.getSort())))
.collect(Collectors.toList());
}