赞
踩
在项目中,经常遇到要使用多表联结查询的操作,就比如在外卖项目中,菜品分页查询时需要展示分类名称字段,但分类名称在分类表里,在正常写完分页查询后会出现以下问题:
此时就需要使用到多表联结。
一.新增一个DishVO类封装菜品的基本信息与分类名称
- import com.sky.entity.DishFlavor;
- import lombok.AllArgsConstructor;
- import lombok.Builder;
- import lombok.Data;
- import lombok.NoArgsConstructor;
- import java.io.Serializable;
- import java.math.BigDecimal;
- import java.time.LocalDateTime;
- import java.util.ArrayList;
- import java.util.List;
-
- @Data
- @Builder
- @NoArgsConstructor
- @AllArgsConstructor
- public class DishVO implements Serializable {
-
- private Long id;
- //菜品名称
- private String name;
- //菜品分类id
- private Long categoryId;
- //菜品价格
- private BigDecimal price;
- //图片
- private String image;
- //描述信息
- private String description;
- //0 停售 1 起售
- private Integer status;
- //更新时间
- private LocalDateTime updateTime;
- //分类名称
- private String categoryName;
- //菜品关联的口味
- private List<DishFlavor> flavors = new ArrayList<>();
-
- //private Integer copies;
- }
二.在编写分页代码时增加亿点点细节
- public Result<Page> dishPageQuery(DishPageQueryDTO dishPageQueryDTO){
-
- log.info("{}",dishPageQueryDTO);
-
-
- //分页构造器
- Page<Dish> pageInfo = new Page<>(dishPageQueryDTO.getPage(),dishPageQueryDTO.getPageSize());
- Page<DishVO> dishVOPage = new Page<>();
- //条件构造器
- LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
-
- queryWrapper.eq(dishPageQueryDTO.getCategoryId()!= null,Dish::getCategoryId,dishPageQueryDTO.getCategoryId());
- queryWrapper.like(dishPageQueryDTO.getName() != null, Dish::getName, dishPageQueryDTO.getName());
- queryWrapper.eq(dishPageQueryDTO.getStatus() != null, Dish::getStatus, dishPageQueryDTO.getStatus());
-
- //添加排序条件
- queryWrapper.orderByDesc(Dish::getUpdateTime);
-
- dishService.page(pageInfo, queryWrapper);
-
- //对象拷贝
- BeanUtils.copyProperties(pageInfo,dishVOPage,"records");
-
- List<Dish> records = pageInfo.getRecords();
- List<DishVO> dishVOList = records.stream().map((item)->{
-
- DishVO dishVO = new DishVO();
-
- //对象拷贝
- BeanUtils.copyProperties(item,dishVO);
-
- //获取item的categoryid
- Long categoryId = item.getCategoryId();
- //根据id查询分类名称
- Category category = categoryService.getById(categoryId);
- dishVO.setCategoryName(category.getName());
- return dishVO;
-
- }).collect(Collectors.toList());
-
- dishVOPage.setRecords(dishVOList);
-
- return Result.success(dishVOPage);
- }
总结一下流程:
1.先进行正常的分页操作;
2.在此基础上增加一个分页构造器dishVOPage,泛型约束为DishVO;
3.使用beanutils复制属性的方法,将分页信息复制给dishVOPage,但需要将records排除,因为records需要进行加工;
4.将records取出,对records的集合通过stream流进行加工,通过分类id查询分类名称,并通过set方式为dishVO的categoryName属性赋值。最后通过对象拷贝将item的基本信息复制给dishVO;
5.将加工好的dishList赋给之前忽略的records;
6.返回分页构造器dishVOPage。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。