当前位置:   article > 正文

关于在项目中使用mybatisplus进行多表查询操作_mybatisplus多表查询

mybatisplus多表查询

概要

在项目中,经常遇到要使用多表联结查询的操作,就比如在外卖项目中,菜品分页查询时需要展示分类名称字段,但分类名称在分类表里,在正常写完分页查询后会出现以下问题:

此时就需要使用到多表联结。

代码编写流程

一.新增一个DishVO类封装菜品的基本信息与分类名称

  1. import com.sky.entity.DishFlavor;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Builder;
  4. import lombok.Data;
  5. import lombok.NoArgsConstructor;
  6. import java.io.Serializable;
  7. import java.math.BigDecimal;
  8. import java.time.LocalDateTime;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. @Data
  12. @Builder
  13. @NoArgsConstructor
  14. @AllArgsConstructor
  15. public class DishVO implements Serializable {
  16. private Long id;
  17. //菜品名称
  18. private String name;
  19. //菜品分类id
  20. private Long categoryId;
  21. //菜品价格
  22. private BigDecimal price;
  23. //图片
  24. private String image;
  25. //描述信息
  26. private String description;
  27. //0 停售 1 起售
  28. private Integer status;
  29. //更新时间
  30. private LocalDateTime updateTime;
  31. //分类名称
  32. private String categoryName;
  33. //菜品关联的口味
  34. private List<DishFlavor> flavors = new ArrayList<>();
  35. //private Integer copies;
  36. }

二.在编写分页代码时增加亿点点细节

  1. public Result<Page> dishPageQuery(DishPageQueryDTO dishPageQueryDTO){
  2. log.info("{}",dishPageQueryDTO);
  3. //分页构造器
  4. Page<Dish> pageInfo = new Page<>(dishPageQueryDTO.getPage(),dishPageQueryDTO.getPageSize());
  5. Page<DishVO> dishVOPage = new Page<>();
  6. //条件构造器
  7. LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
  8. queryWrapper.eq(dishPageQueryDTO.getCategoryId()!= null,Dish::getCategoryId,dishPageQueryDTO.getCategoryId());
  9. queryWrapper.like(dishPageQueryDTO.getName() != null, Dish::getName, dishPageQueryDTO.getName());
  10. queryWrapper.eq(dishPageQueryDTO.getStatus() != null, Dish::getStatus, dishPageQueryDTO.getStatus());
  11. //添加排序条件
  12. queryWrapper.orderByDesc(Dish::getUpdateTime);
  13. dishService.page(pageInfo, queryWrapper);
  14. //对象拷贝
  15. BeanUtils.copyProperties(pageInfo,dishVOPage,"records");
  16. List<Dish> records = pageInfo.getRecords();
  17. List<DishVO> dishVOList = records.stream().map((item)->{
  18. DishVO dishVO = new DishVO();
  19. //对象拷贝
  20. BeanUtils.copyProperties(item,dishVO);
  21. //获取item的categoryid
  22. Long categoryId = item.getCategoryId();
  23. //根据id查询分类名称
  24. Category category = categoryService.getById(categoryId);
  25. dishVO.setCategoryName(category.getName());
  26. return dishVO;
  27. }).collect(Collectors.toList());
  28. dishVOPage.setRecords(dishVOList);
  29. return Result.success(dishVOPage);
  30. }

小结

总结一下流程:

1.先进行正常的分页操作;

2.在此基础上增加一个分页构造器dishVOPage,泛型约束为DishVO;

3.使用beanutils复制属性的方法,将分页信息复制给dishVOPage,但需要将records排除,因为records需要进行加工;

4.将records取出,对records的集合通过stream流进行加工,通过分类id查询分类名称,并通过set方式为dishVO的categoryName属性赋值。最后通过对象拷贝将item的基本信息复制给dishVO;

5.将加工好的dishList赋给之前忽略的records;

6.返回分页构造器dishVOPage。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/625054
推荐阅读
相关标签
  

闽ICP备14008679号