编程技术文章分享与教程

网站首页 > 技术文章 正文

技术日常系列——我让同事用join关联查询,同事说不用

hmc789 2024-11-16 20:54:09 技术文章 1 ℃

问题(场景)

    今天有个需求,我看是用来关联用户表和订单表。
    前端有个页面,要查询订单和客户基本信息。

案件号

客户id

客户姓名

客户年龄

240121112134

100002

张三

26

这个页面字段来自两张表:
* t_cus
* t_case

我的解决方案

我当时跟我同事说了下,直接关联查询解决吧。
直接写sql:
select c.case_no,c,cus_id,u,cus_name,u.cus_age
from t_case c
left join t_cus u on u.cus_id = c.cus_id

同事看了我的方案,不让我这么做

同事解决方案

思路如下:
先从t_case表查出10条数据到内存(t_case作为主表),然后取出10条数据的uid,再调用CusService#listCus(uids),得到对应的cusList。此时内存中有10条Case,也有10条cus,匹配组合即可。
代码如下:

public List<CaseExtendsTO> getList(Integer page, Integer pageSize) {
    // 1.查询Case
    List<Case> caseList = listCase(page, pageSize);
    // 2.取出里面的所有uid
    List<Long> uids = caseList.stream()
            .map(Case::getUid)
            .collect(Collectors.toList());
    // 3.查出cusList
    List<Cus> cusList = listCus(uids);
    // 4.把List转成Map
    Map<Long, Cus> cusMap = new HashMap<Long, Cus>();
    for(cusList : cus){
        cusMap.put(cus.getId(), cus);
    }

    // 组合并返回数据
    List<CaseExtendsTO> result = new ArrayList<>();
    CaseList.foreach(Case->{
        CaseExtendsTO CaseExtends = new CaseExtendsTO();
        BeanUtils.copyProperties(Case, CaseExtends);
        // 根据Case的uid从cusMap获取cus(此处省略cus null判断)
        Cus cus = cusMap.get(Case.getUid());
        CaseExtends.setCusAge(cus.getCusAge());
        CaseExtends.setCusName(cus.getCusName());
        result.add(CaseExtends);
    });

    return result;
}

同事后来又优化了一下(主要第4点):

public List<CaseExtendsTO> getList(Integer page, Integer pageSize) {
    // 1.查询Case
    List<Case> caseList = listCase(page, pageSize);
    // 2.取出里面的所有uid
    List<Long> uids = caseList.stream()
            .map(Case::getUid)
            .collect(Collectors.toList());
    // 3.查出cusList
    List<Cus> cusList = listCus(uids);
    // 4.把List转成Map(优化了这里)
    Map<Long, Cus> cusMap = cusList.stream()
            .collect(Collectors.toMap(Cus::getId(), cus->cus));

    // 组合并返回数据
    List<CaseExtendsTO> result = new ArrayList<>();
    caseList.foreach(case->{
        CaseExtendsTO caseExtends = new CaseExtendsTO();
        BeanUtils.copyProperties(case, caseExtends);
        // 根据case的uid从cusMap获取cus(此处省略cus null判断)
        Cus cus = cusMap.get(case.getUid());
        caseExtends.setCusAge(cus.getCusAge());
        caseExtends.setCusName(cus.getCusName());
        result.add(caseExtends);
    })

    return result;
}

思路扩展

    有时遇到复杂的统计报表等数据,很难通过上面“内存关联”的方式完成需求,
    此时可能如果有大数据部门,可以利用大数据的技术进行解决。进行不断的优化,性能达到最好。

留个关注

《日常分享系列》,会持续更新,想了解的朋友可以关注 ,文章有帮助的话可以长按点赞有惊喜!!!文章比较长,大家可以先 收藏转发后再看有什么补充可以在下面评论,谢谢大家

Tags:

标签列表
最新留言