三种方式查询三级分类Tree
话不多说,直接上代码
方式一:for循环嵌套一下
/**
* 查询三级分类
*
* @return
*/
@Override
public List<GoodsType> findNodes() {
// 方式一:查询三级分类
// 查询一级分类
Long parentId = 0L;
List<GoodsType> levelOneGoodsTypeList = getList(parentId);
// 查询二级分类和三级分类
for (GoodsType levelOne : levelOneGoodsTypeList) {
List<GoodsType> levelTwoGoodsTypeList = getList(levelOne.getId());
// 封装二级数据
levelOne.setChildren(levelTwoGoodsTypeList);
for (GoodsType levelTwo : levelTwoGoodsTypeList) {
List<GoodsType> levelThreeGoodsTypeList = getList(levelTwo.getId());
// 封装三级数据
levelTwo.setChildren(levelThreeGoodsTypeList);
// TODO 设置其他前端需要的值
}
}
return levelOneGoodsTypeList;
}
方式二:Mybatis N级递归查询
// 方式二:使用自定义SQL语句,查询三级分类
// 查询redis中是否存在
String json = redisTemplate.opsForValue().get(RedisConst.GOODS_TYPE_NODES_CACHE);
List<GoodsType> goodsTypes = JSONObject.parseArray(json, GoodsType.class);
if (goodsTypes == null) {
// 查询所有分类列表
goodsTypes = goodsTypeMapper.findNodes(0L);
// 存入redis中
hasChildList(goodsTypes);
redisTemplate.opsForValue().set(RedisConst.GOODS_TYPE_NODES_CACHE, JSONObject.toJSONString(goodsTypes), 10, TimeUnit.DAYS);
}
// 下面的代码是mapper.xml中的
<resultMap id="nestedMap" type="com.atguigu.wms.model.base.GoodsType" autoMapping="true">
<id property="id" column="id"></id>
<result property="label" column="name"></result>
<result property="value" column="id"></result>
<collection property="children"
column="id"
select="findNodes"
ofType="com.atguigu.wms.model.base.GoodsType"></collection>
</resultMap>
<select id="findNodes" resultMap="nestedMap">
SELECT
id,
name,
parent_id,
create_time,
update_time
FROM
goods_type
WHERE
parent_id = #{parentId}
</select>
方式三:Stream流递归处理
// 方式三:查询三级分类,递归写法
public List<GoodsType> findTree(){
//1.查出所有分类
List<GoodsType> all = baseMapper.selectList(null);
// return findNodesTree(all.get(0),all);
return all.stream().filter(item ->
item.getParentId() == 0
).peek(child -> {
// 处理一级分类
child.setChildren(findNodesTree(child, all));
child.setLabel(child.getName());
child.setValue(child.getId().toString());
}).collect(Collectors.toList());
}
/**
* 递归查询子节点
*
* @param goodsType
* @param all
* @return
*/
private List<GoodsType> findNodesTree(GoodsType goodsType, List<GoodsType> all) {
return all
.stream()
// 处理二级、三级分类
.filter((child -> Objects.equals(goodsType.getId(), child.getParentId())))
.peek((child -> {
child.setChildren(findNodesTree(child, all));
// 设置前端需要的属性
child.setLabel(child.getName());
child.setValue(child.getId().toString());
}))
.peek(child -> {
// 对没有子元素的节点进行处理
if (child.getChildren() == null || child.getChildren().size() == 0) child.setChildren(null);
})
.collect(Collectors.toList());
}
效果如下

三种方式查询三级分类Tree的更多相关文章
- Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...
- android sqlite使用之模糊查询数据库数据的三种方式
android应用开发中常常需要记录一下数据,而在查询的时候如何实现模糊查询呢?很少有文章来做这样的介绍,所以这里简单的介绍下三种sqlite的模糊查询方式,直接上代码把: package com.e ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)
一,软件准备 coreseek4.1 (包含coreseek测试版和mmseg最新版本,以及测试数据包[内置中文分词与搜索.单字切分.mysql数据源.python数据源.RT实时索引等测 ...
- PHP的学习--连接MySQL的三种方式
记录一下PHP连接MySQL的三种方式. 先mock一下数据,可以执行一下sql. /*创建数据库*/ CREATE DATABASE IF NOT EXISTS `test`; /*选择数据库*/ ...
- ios网络学习------4 UIWebView的加载本地数据的三种方式
ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...
- Oracle 行转列总结 Case When,Decode,PIVOT 三种方式 - 转
最近又碰到行专列问题了,当时不假思索用的是子查询,做完后我询问面试管行专列标正的写法应该如何写,他告诉我说应该用"Decode",索性我就总结一下,一共三种方式 --======= ...
- 前端js,css文件合并三种方式,bat命令
前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...
- [转]php和html混编的三种方式
php和html混编的三种方式 以下内容转自:http://blog.i1728.com/post/110.html 原文标题是:<PHP的(<<>,新标题是我加的,文章里的红 ...
- 【百度地图API】关于如何进行城市切换的三种方式
原文:[百度地图API]关于如何进行城市切换的三种方式 摘要:本文介绍了三种切换城市的方式:查询城市.城市列表和显示城市轮廓. ------------------------------------ ...
随机推荐
- 使用 Python ssh 远程登陆服务器的最佳方案
在使用 Python 写一些脚本的时候,在某些情况下,我们需要频繁登陆远程服务去执行一次命令,并返回一些结果. 在 shell 环境中,我们是这样子做的. sshpass -p ${passwd} s ...
- Solution -「SP 106」BINSTIRL
Description Link. 求 \(\begin{Bmatrix}n \\ m\end{Bmatrix}\bmod2\) Solution 求 \[\begin{aligned} \begin ...
- RCU的简单认识
RCU RUC是什么? RCU(Read-Copy-Update)是一种用于并发编程的技术,旨在提供高效且无锁(lock-free)的读操作,同时保证数据一致性和并发性. 也就是说他并不需要锁的机制来 ...
- 有人说SaToken吃相难看,你怎么看。
前言 今天摸鱼逛知乎,偶然看到了一个回答,8月份的,是关于SaToken的,一时好奇就点了进去. 好家伙,因为一个star的问题,提问的人抱怨了许多,我有些意外,就仔细看了下面的评论,想知道一部分人的 ...
- c语言代码练习--函数
函数: 一,概念: 1,在计算科学中,子程序(英语:Subroutione,procedure,function,rotine,method.subprogram,callable unit),是一个 ...
- linux常用命令(八) tar 打包、压缩、解包、解压缩
Linux 常用的压缩与解压缩命令有:tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar 等. 首先要弄清 ...
- IEEE 国际计算科学与工程会议 (CSE-2023)
随着计算机系统变得越来越庞大和复杂,基于数据的计算技术在支持下一代科学和工程应用方面发挥着关键作用.如今,科学和工程中基于云的复杂大数据应用由异构软件/硬件/网络组件组成,这些组件的容量.可用性和环境 ...
- Convolutional neural network (CNN)–extreme learning machine (ELM)
1. 介绍 论文:(2020)Neural networks for facial age estimation: a survey on recent advances. 地址: http://li ...
- MPL协议原文
MPL协议原文 原文参考链接 中文翻译有一个,但是只翻译了两条 原文 Mozilla Public License Version 2.0 1. Definitions 1.1. "Cont ...
- QT中级(2)QTableView自定义委托(二)实现QProgressBar委托
同系列文章 QT中级(1)QTableView自定义委托(一)实现QSpinBox.QDoubleSpinBox委托 QT中级(2)QTableView自定义委托(二)实现QProgressBar委托 ...