需求如下:现有三个实体,A,B,C; A-B:一对多,A-C,一对多, A(一)-B(多)-C(多) 要作为一个视图整体呈现。现需要查出所有的A,及其对应B与C渲染在前端。 方案一: 写一方法,逐个查询:
需求如下:现有三个实体,A,B,C; A-B:一对多,A-C,一对多, A(一)-B(多)-C(多) 要作为一个视图整体呈现。现需要查出所有的A,及其对应B与C渲染在前端。
方案一: 写一方法,逐个查询: 遍历查询A ===> 根据关联属性 查询多个B,同时查询多个C ==> 组装;
优点:简单; 缺点: 效率低下;
方案二: mybatis就写一映射Mapping,做这个事情; Hibernate可以通过QBC,HQL,SQL同理做这样的事情;
优点:可优化,代码量少; 缺点: 要单独写数据库语句,较繁杂,耦合度高,不可复用,维护成本高;
方案三:当当当当当..... 请看大屏幕:
Test{public String test(){
List<A> idList = A_Dao.selectAll().stream().map(A::getId).collect(Collectors.toList());
List<B>BList=B_DAO.selectByRuleIds(idList);
List<C> CList=C_DAO.selectByRuleIds(idList);
Map<Integer,List<B>> B_Map=new HashMap<Integer, List<B>>();
Map<Integer,List<C>> C_Map=new HashMap<Integer, List<C>>();
idList.stream().forEach(outer->{
List list = new ArrayList<B>();
B_List.stream().filter(inner->inner.getRuleId()==outer).forEach(i->{
list.add(i);
});
B_Map.put(outer,list);
});
idList.stream().forEach(outer->{
List list = new ArrayList<C>();
C_List.stream().filter(inner->inner.getRuleId()==outer).forEach(i->{
list.add(i);
});
C_Map.put(outer,list);
});
List<A_B_C> A_B_C_List = new ArrayList<>();
idList.stream().forEach(i->{
A_B_C abc= new A_B_C();
A_B_C.setBs(B_Map.get(i));
A_B_C.setCs(C_Map.get(i));
A_B_C_List.add(abc);
});
return abc;
}
}
其中,嵌套流操作,配合filter实现 归并的功能!