java8实现归并操作,数据库多个 多对多映射的处理技巧

  需求如下:现有三个实体,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实现 归并的功能!

发布了323 篇原创文章 · 获赞 153 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_36285943/article/details/97835049