我们在查询数据时,经常需要在查出主数据的同时,还需查出来与之关联的明细数据.实体类类似这样:
这样的话,首先需要查询出来主表数据,然后根据id,再去查明细表数据,一般情况下做法都是这样的:
虽然也可以实现功能,但是如果数据量很大,或者有很多用户同时操作,并发量大,数据库很容易就寄了,因此我们需要换一种思路,可以先把主表数据的id提取成一个list集合,然后使用list集合把明细数据一次全部查出来,然后放到一个list集合中,然后我们定义一个Map,Map的key是主表id,value就是对应的明细表数据,这时候再次遍历主表,只需要根据主表id去getMap的value就可以获取到相对应的明细数据.这么一大堆,看的头晕眼花,我们直接看代码:
如果主表数据为10条,本来需要访问数据库1+10次,但是现在只需要访问1+1次即可,大大减轻了数据库的压力.最后,附上代码;
//主表数据查询
List<InventoryModel> list = inventoryCrudBiz.getBaseMapper().selectInventoryList(model, (pageNo - 1) * pageSize, pageSize, sql);
//将主表id放到list集合中
List<String> idsList = new ArrayList<>();
list.forEach(inventory -> {
idsList.add(inventory.getId());
});
//根据主表id的list集合去查询明细数据
List<InventoryItemModel> itemModels = inventoryCrudBiz.getBaseMapper().selectItemByInventoryIds(idsList);
//将查询到的数据放入map中,其中key是主表id,value是相对应的明细表
//Collectors.groupingBy()方法将括号中的式子作为条件进行分组
Map<String, List<InventoryItemModel>> map = itemModels.stream().collect(Collectors.groupingBy(InventoryItemModel::getInventoryId));
//把分好组的明细数据赋值到主表中
list.forEach(inventory ->{
inventory.setInventoryItemModelList(map.get(inventory.getId()));
});
大功告成,查询出的数据也没有错误,可能还有其他更好的方法和改进点,恭听各位大佬指点