ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

三种方式查询三级分类Tree

2022-06-20 00:04:40  阅读:121  来源: 互联网

标签:return Tree 分类 List 查询 child 三级


话不多说,直接上代码

方式一: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());
    }

效果如下

image

标签:return,Tree,分类,List,查询,child,三级
来源: https://www.cnblogs.com/qbbit/p/16391851.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有