三级分类查询
表结构
首先让我们看一下表

其中parent_cid用于存储父id 我们可以根据父id以树形的方式来展示数据
其次在让我们看一下表中数据

由此可知parent_cid为0表示没有父id 也就是根节点
业务实现
在category实体类中添加children属性 用于存储字节点 @TableField(exist = false) 用于表示此属性在数据库中不存在 mybatis plus 执行crud操作时忽略
@TableField(exist = false)
private List<PmsCategory> children;
首先将所所有的分类查询出来 之后根据java 8 steam流来进行流水线操作来生成我们想要的数据
List<PmsCategory> pmsCategories = categoryMapper.selectList(null);
首先根据之前表数据知道了parent_id为0表示为根节点 我们首先将根节点过滤出来
List<PmsCategory> treeCategoryList = pmsCategories
.stream()
.filter((category -> category.getParentCid() == 0))
.collect(Collectors.toList());
peek可以对流中没一个元素进行操作返回 我们可以使用peek来设置字节点 调用getChildren获取子节点
List<PmsCategory> treeCategoryList = pmsCategories
.stream()
.filter((category -> category.getParentCid() == 0))
.peek((category -> category.setChildren(getChildren(category, pmsCategories))))
.collect(Collectors.toList());
return treeCategoryList;
getChildren的实现是一个递归操作 因为遍历的子节点还可能有子节点 需要传入两个参数 参数一为根节点对象 参数二为所有节点的list 从list中查询节点
根据若root个节点 等于 要遍历的parentId就表示他们是父子关系 因为过滤后的节点还有可能有子节点调用peek进行递归调用 设置子节点
private List<PmsCategory> getChildren(PmsCategory root, List<PmsCategory> allCategory) {
List<PmsCategory> children = allCategory
.stream()
.filter((category -> Objects.equals(root.getCatId(), category.getParentCid())))
.peek((category -> {
category.setChildren(this.getChildren(category, allCategory));
}))
.collect(Collectors.toList());
return children;
}
调用sort进行排序
因为sort可能为0 设置若sort对象不存在 设置为0
整体代码实现

虽然道路是曲折的,但前途是光明的。

浙公网安备 33010602011771号