栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

关于mybatis多表联查导致列表数据量异常的处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于mybatis多表联查导致列表数据量异常的处理

关于mybatis多表联查导致列表数据量异常的处理

本文章的方法只是一种解决方法,不确定对数据查询速率或其他是否有影响,但是相比于把主表数据查询后再循环查询具体信息来说,查询次数大幅度降低。

问题解析

问题为:在一对多的关系中,使用多表联查,往往会查询出多于主表数量的数据,通过mybatis解析后,数据会进行合并,但是翻页查询结果中的 total 总数,是不会减少的,这样就导致分页查询时,获取到的总量与实际总量不匹配的问题。

解决方法 SQL

我们先看一下多表联查的SQL






    
        
        
        
        
        
            
            
            
                
                
                
            
        
    

    
        FROM lims_task_bill_detail d
        LEFT JOIN lims_task_bill_detail_project p ON p.detail_id = d.id
        LEFT JOIN lims_base_test_project pr on pr.id = p.project_id
    

    

    


通过编写 resultMap 结果集,我们能将查询的数据进行合并,
定义两格查询方法:

  • 多表联查,保留主表ID,进行条件查询,这里不只查询主表,而同样采用多表联查方式,是因为,这个查询方法是实际意义上的分页查询方法,同时带有对所有关联表进行条件查询的功能。
  • 多表联查,查询所有数据。这个查询,是我们写多表联查的真实目的,查询详细信息,并列表返回
Mapper
// 查询详细信息列表
List selectDetailList(@Param("ew") Wrapper queryWrapper);
// 查询详细信息列表分页数据(只获取主表ID),配合selectDetailList使用
IPage selectDetailListPage(IPage page, @Param("ew") Wrapper queryWrapper);

注意这两个方法,一个用于分页,一个用于查询列表,参数与返回类型都不一样。

Service
	public IPage getDetailList(String page, String limit) {
		// 列表,用于存放本次分页获取到的列表数据的ID,为再次多表联查查询详情做准备
        List ids = new ArrayList<>();
        // 分页获取实际意义上的主表分页
        IPage taskBillDetailIPage = buildPage(page, limit);
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.apply("1=1"); // 这里必须写,否则没有where条件会报错
        queryWrapper.groupBy("d.id"); // 先查询本页有哪些数据
        taskBillDetailIPage = mapper.selectDetailListPage(taskBillDetailIPage, queryWrapper);
        // 循环获取本次分页查询得到的ID
        for (TaskBillDetail record : taskBillDetailIPage.getRecords()) {
            ids.add(record.getId());
        }
        // 再根据本页的数据的ID列表获取本页具体数据
        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.in("d.id", ids);
        List taskBillDetails = mapper.selectDetailList(wrapper);
        // 设置数据到分页对象中
        taskBillDetailIPage.setRecords(taskBillDetails);
        return taskBillDetailIPage;
    }

这样一来,即获取到了真正的数量,有同时获取到了这4条数据的详细信息。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324987.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号