多表联查,告别left join

 

表1:资料表,字段主要有:id,name,file_location_id(bigint),theme_name_id(bigint), labels(String类型,实际是ids,有',')

表2:目录表,字段主要有:id,file_location(String)

表3:主题表,字段主要有:id,theme_name(String)

表4:标签表,字段主要有:id,label(String)

 

VO层

 @Data
 public class BasicVO{
     
     private Long id;
     
     private String name;
     
     private String fileLocation;
     
     private String themeName;
     
     private String label;
 }

serviceImpl层

 @Service
 public class BasicServiceImpl implements BasicService{
     @Autowired
     private BasicMapper basicMapper;
     
     @Autowired
     private LabelMapper labelMapper;
 
     @Autowired
     private FileMapper fileMapper;
 
     @Autowired
     private ThemeMapper themeMapper;
     
     /**
      * 分页查询
      */
     @Override
     public Page<Basic> selectList(Integer page, Integer limit) {
         Page pageData = new Page<>(page,limit);
         IPage<Basic> basicIPage = basicMapper.selectPage(pageData, null);
         List<Basic> records = basicIPage.getRecords();
 
         List<BasicVO> basicVOList = new ArrayList<>();
         for (Basic basic : records) {
             BasicVO basicVO = new BasicVO();
             BeanUtils.copyProperties(basic,basicVO);
             
             //查询目录的条件构造器,'id'为目录表的id,basic.getFileLocationId()为资料表的关联id
             QueryWrapper queryWrapper =new QueryWrapper();
             queryWrapper.eq("id",basic.getFileLocationId());
             basicVO.setFileLocation(fileMapper.selectOne(queryWrapper).getFileLocation());
             
  //查询主题名称的条件构造器,'id'为主题表的id,basic.getThemeNameId()为资料表的关联id
             QueryWrapper queryWrapper1 =new QueryWrapper();
             queryWrapper1.eq("id",basic.getThemeNameId());
             basicVO.setThemeName(themeMapper.selectOne(queryWrapper1).getName());
 
             // 获取标签的ids
             String labels = basic.getLabels();
             String[] split = labels.split(",");
             // 将String类型的数组 转换成Long 类型的List
             Long[] longs =(Long[]) ConvertUtils.convert(split ,Long.class);
             List<Long> idsLong = Arrays.asList(longs);
             
             List<Label> labels = labelMapper.selectBatchIds(idsLong);
             String str ="";
             for (Label label : labels) {
                 String sName = label.getName();
                 str += ","+sName;
            }
             basicVO.setLabel(str.substring(1));
 
             basicVOList.add(basicVO);
        }
         pageData.setRecords(basicVOList);
         return pageData;
    }
 }
 
 

省略其他层

根据不同需求和不同前端框架处理结果就可以了

 

posted @   河马小海豚  阅读(991)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示