三种方式查询三级分类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]关于如何进行城市切换的三种方式 摘要:本文介绍了三种切换城市的方式:查询城市.城市列表和显示城市轮廓. ------------------------------------ ...
随机推荐
- Gradle安装配置教程
一.安装前检查 检查电脑上是否安装JDK,如果没有安装,请查看JDK安装教程:点击查看 如果电脑上已经安装JDK,按Win + R键,输入cmd,然后点击确定 输入java -version,点击回车 ...
- c++中的数论知识
写在开头:word的公式打不上来,只能截图了 一.组合数学 (1) 加法定理与乘法原理 加法原理:做一件事情,完成它可以有n类办法,在第一类办法中有m1种不同的方法,在第二类办法中有m2种不同的方法, ...
- ES13 中11个令人惊叹的 JavaScript 新特性
前言 与许多其他编程语言一样,JavaScript 也在不断发展.每年,该语言都会通过新功能变得更加强大,使开发人员能够编写更具表现力和简洁的代码. 小编今天就为大家介绍ES13中添加的最新功能,并查 ...
- Destoon模板存放及调用规则
一.模板存放及调用规则 模板存放于系统 template 目录,template 目录下的一个目录例如 template/default/ 即为一套模板模板文件以 .htm 为扩展名,可直接存放于模板 ...
- c语言代码练习10(改进)
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <ma ...
- css中的字体样式
一.字体的样式 font-style:"normal" 正常 font-style:"italic"斜体 二.字体的粗细 font-weight:"b ...
- 11G RAC 11.2.0.1.0实例evict故障处理
Aix 7.1 参考文档: https://blogs.oracle.com/database4cn/rac Resolving ORA-481 and "terminating the i ...
- 小景的Dba之路--Oracle用exp导出dmp文件很慢
小景最近在系统压测相关的工作,其中涉及了Oracle数据库相关的知识,之前考的OCP证书也在此地起了作用.今天的问题是:Oracle用exp导出dmp文件很慢,究竟是什么原因,具体的解决方案都有哪些呢 ...
- 手把手教你在项目中引入Excel报表组件
摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 GrapeCity Documents for Excel(以下 ...
- 一键修改IP多实例
一键修改IP多实例-v1 #!/bin/bash #2020-03-01 #auto change ip #By Flyaway ###################### grep "d ...