三级分类查询
表结构
首先让我们看一下表
其中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
整体代码实现
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律