SpringBoot查找多级商品方案【一次sql查询所有数据,循环处理分层逻辑】

这篇具有很好参考价值的文章主要介绍了SpringBoot查找多级商品方案【一次sql查询所有数据,循环处理分层逻辑】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、查找所有商品

1、service

CategoryServiceImpl.java

/**
	 * 耗时:http(请求微信api) > 磁盘 > 内存
	 * mysql(内网+磁盘)
	 * @return
	 */
	@Override
	public ResponseVo<List<CategoryVo>> selectAll() {
		List<Category> categories = categoryMapper.selectAll();

		//查出parent_id=0
//		for (Category category : categories) {
//			if (category.getParentId().equals(ROOT_PARENT_ID)) {
//				CategoryVo categoryVo = new CategoryVo();
//				BeanUtils.copyProperties(category, categoryVo);
//				categoryVoList.add(categoryVo);
//			}
//		}

		//lambda + stream
		List<CategoryVo> categoryVoList = categories.stream()
				.filter(e -> e.getParentId().equals(ROOT_PARENT_ID))
				.map(this::category2CategoryVo)
				.sorted(Comparator.comparing(CategoryVo::getSortOrder).reversed())
				.collect(Collectors.toList());

		//查询子目录
		findSubCategory(categoryVoList, categories);

		return ResponseVo.success(categoryVoList);
	}

this::category2CategoryVo 等价于 e -> category2CategoryVo(e)

2、循环查找子目录

CategoryServiceImpl.java

private void findSubCategory(List<CategoryVo> categoryVoList, List<Category> categories) {
		for (CategoryVo categoryVo : categoryVoList) {
			List<CategoryVo> subCategoryVoList = new ArrayList<>();

			for (Category category : categories) {
				//如果查到内容,设置subCategory, 继续往下查
				if (categoryVo.getId().equals(category.getParentId())) {
					CategoryVo subCategoryVo = category2CategoryVo(category);
					subCategoryVoList.add(subCategoryVo);
				}

				subCategoryVoList.sort(Comparator.comparing(CategoryVo::getSortOrder).reversed());
				categoryVo.setSubCategories(subCategoryVoList);

				findSubCategory(subCategoryVoList, categories);
			}
		}
	}

3、直接拷贝数据

CategoryServiceImpl.java

	private CategoryVo category2CategoryVo(Category category) {
		CategoryVo categoryVo = new CategoryVo();
		BeanUtils.copyProperties(category, categoryVo);
		return categoryVo;
	}

二、根据categoryId查找多级商品

1、ProductServiceImpl.java

    @Override
    public ResponseVo<PageInfo> list(Integer categoryId, Integer pageNum, Integer pageSize) {
		Set<Integer> categoryIdSet = new HashSet<>();
		if (categoryId != null) {
            // 给categoryIdSet赋值子目categoryId
			categoryService.findSubCategoryId(categoryId, categoryIdSet);
			categoryIdSet.add(categoryId);
		}

		PageHelper.startPage(pageNum, pageSize);
		List<Product> productList = productMapper.selectByCategoryIdSet(categoryIdSet);
		List<ProductVo> productVoList = productList.stream()
				.map(e -> {
					ProductVo productVo = new ProductVo();
					BeanUtils.copyProperties(e, productVo);
					return productVo;
				})
				.collect(Collectors.toList());

		PageInfo pageInfo = new PageInfo<>(productList);
		pageInfo.setList(productVoList);
		return ResponseVo.success(pageInfo);
	}

2、CategoryServiceImpl.java文章来源地址https://www.toymoban.com/news/detail-651747.html

    @Override
	public void findSubCategoryId(Integer id, Set<Integer> resultSet) {
		List<Category> categories = categoryMapper.selectAll();
		findSubCategoryId(id, resultSet, categories);
	}

	private void findSubCategoryId(Integer id, Set<Integer> resultSet, List<Category> categories) {
		for (Category category : categories) {
			if (category.getParentId().equals(id)) {
				resultSet.add(category.getId());
				findSubCategoryId(category.getId(), resultSet, categories);
			}
		}
	}

    

到了这里,关于SpringBoot查找多级商品方案【一次sql查询所有数据,循环处理分层逻辑】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 很好用的mysql父子集查询SQL(根据父级查询所有子集)

    在表中一定要有id和pid,这样才能使用该sql。 根据pid查询出其下的所有子集(比如,子集的子集的子集…)全部查询出来。 首先,在表中按照父节点(parent_id)和id字段(id)的顺序对数据进行排序,并将排序后的结果存入 org_query 子查询中。 然后,使用变量 @id 以递归方式检索所

    2024年02月15日
    浏览(38)
  • 使用navicat利用sql语句查询表所有字段的字段名,类型,长度。

    想要在navicat下,用sql语句查询一个表的所有字段和其相关信息。 打开所需要查询的表的数据库 查新建询 把下面的sql语句复制粘贴到新建的查询编辑器中并修改库名和表 这样表的相关信息就会显示出来了,将其选中,点击鼠标右键,——复制为——制表符分隔值(字段名和

    2023年04月08日
    浏览(99)
  • mysql:IN最多只能查询1000个,如果要一次性查询出来,使用以下sql实现

    1、 if test=\\\"(index % 999) == 998\\\" :余数等于998,将,置为NULL SELECT mph.PO_HEADER_ID, mph.PO_NUMBER, mid.INSTRUCTION_DOC_STATUS, mid.INSTRUCTION_DOC_NUM FROM mt_po_header mph LEFT JOIN mt_instruction mi ON mi.SOURCE_ORDER_ID = mph.PO_HEADER_ID LEFT JOIN mt_instruction_doc mid ON mid.INSTRUCTION_DOC_ID = mi.SOURCE_DOC_ID WHERE mph.TENANT_ID = 7 AND

    2023年04月09日
    浏览(71)
  • Sql Server中查询数据库所有表及其数据总条数和占用空间

    1、查询某数据库中的所有数据表 SELECT name 数据表 FROM sysobjects WHERE xtype=\\\'u\\\' ORDER BY name 2、查询某数据库中的所有数据表及其数据总条数 SELECT a.name 数据表, b.rows 数据总条数 FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE ( a.type = \\\'u\\\' ) AND ( b.indid IN ( 0, 1 ) ) ORDER BY a.name,b.row

    2024年02月02日
    浏览(47)
  • Mybatis-Plus详解(新建maven项目、查询所有信息、打印SQL日志、实现CRUD(增删改查)、分页、条件查询且分页,前后端分离式开发)

    MyBatis-Plus(opens new window) (简称MP) 是一个MyBatis(opens new window)的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。想查看官网相关内容的化我这里提供了官网地址:https://baomidou.com/ 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般

    2024年02月04日
    浏览(71)
  • PostgreSQL查询慢sql原因和优化方案

    PostgreSQL sql查询慢优化方案有一下几种解决方案: 查询慢sql的执行会话,关闭进程。 查看数据库后台连接进程 查看数据库后台连接进程,但是此条SQL不包含当前查询进程 查看当前慢SQL,例如查询执行时间超过1秒的SQL 可以使用pg_terminate_backend()终止连接。您必须是超级用户才能

    2024年02月13日
    浏览(60)
  • SpringBoot所有单元测试出现错误以及测试过程中显示链接错误解决方案

     感觉没改什么东西,但是全部test全部标红,并且原始项目也运行不起来了出现这样的报错 最后发现是持久层忘记去加@Data注解 写这篇博客是为了记录ssm项目入门时出现的bug(遭不住了)

    2024年02月03日
    浏览(37)
  • SpringBoot中操作Redis通过所有可能的key查询存在的key并解析为对象实体的通用方法

    SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list: SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list_霸道流氓气质的博客-CSDN博客 在上面讲操作redis中特殊操作时,对于通过key的集

    2023年04月09日
    浏览(43)
  • 淘宝店铺所有商品api、店铺商品列表、店铺列表接口

    获取店铺所有商品接口API是一种用于获取电商平台上商品详情接口的接口,通过该接口,用户可以根据商品的ID或其他关键信息,向电商平台发送请求,获取商品的详情数据。用户可以根据这些数据进行统计分析、制作报表或进行数据挖掘,帮助卖家更好地了解市场需求和受

    2024年02月09日
    浏览(40)
  • 03 SpringBoot实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

    需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址:portal/findAllTypes 请求方式:get 请求参数:无 响应数据: 成功 代码编写 PortalController : TypeService: TypeServiceImpl: 达到的效果是,不需要任何参数, 只要访问portal/findAllType, 就返回news_type表中的所有

    2024年01月24日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包