三种方式查询三级分类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());
    }

效果如下

image

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Java 语言编写三级分类递归树形查询的示例代码: ```java import java.util.ArrayList; import java.util.List; public class Category { private int id; private String name; private int parentId; private List<Category> children; public Category(int id, String name, int parentId) { this.id = id; this.name = name; this.parentId = parentId; this.children = new ArrayList<>(); } public void addChild(Category child) { children.add(child); } public int getId() { return id; } public String getName() { return name; } public int getParentId() { return parentId; } public List<Category> getChildren() { return children; } } public class CategoryTree { private List<Category> categories; public CategoryTree(List<Category> categories) { this.categories = categories; } public void buildTree() { for (Category category : categories) { if (category.getParentId() != 0) { Category parentCategory = findParentCategory(category.getParentId()); parentCategory.addChild(category); } } } private Category findParentCategory(int parentId) { for (Category category : categories) { if (category.getId() == parentId) { return category; } } return null; } public void printTree() { for (Category category : categories) { if (category.getParentId() == 0) { printCategory(category, 0); } } } private void printCategory(Category category, int level) { for (int i = 0; i < level; i++) { System.out.print("-"); } System.out.println(category.getName()); for (Category child : category.getChildren()) { printCategory(child, level + 1); } } } public class Main { public static void main(String[] args) { List<Category> categories = new ArrayList<>(); categories.add(new Category(1, "电子产品", 0)); categories.add(new Category(2, "手机", 1)); categories.add(new Category(3, "平板电脑", 1)); categories.add(new Category(4, "笔记本电脑", 1)); categories.add(new Category(5, "服装鞋帽", 0)); categories.add(new Category(6, "男装", 5)); categories.add(new Category(7, "女装", 5)); categories.add(new Category(8, "童装", 5)); categories.add(new Category(9, "玩具", 0)); categories.add(new Category(10, "益智玩具", 9)); categories.add(new Category(11, "模型玩具", 9)); categories.add(new Category(12, "塑料积木", 10)); categories.add(new Category(13, "木质积木", 10)); categories.add(new Category(14, "遥控玩具", 11)); CategoryTree categoryTree = new CategoryTree(categories); categoryTree.buildTree(); categoryTree.printTree(); } } ``` 在这个示例中,我们创建了一个 Category 类来表示分类,每个分类有一个 id、一个名称、一个父分类的 id,以及一个子分类的列表。我们还创建了一个 CategoryTree 类来表示分类树,包含一个分类列表,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值