java一对多利用stream优雅增删改数据同步

 一对多模型数据同步,多方根据某唯一字段做新增与更新,并删除新数据中不存在的旧数据

            List amisModels = amisModelDao.findByModelClass(modelClass.getSimpleName());
            if (CollectionUtils.isNotEmpty(amisModels) && amisModels.size() > 1) {
                throw new Exception("存在重复记录");
            }
            List amisModelFields = new ArrayList<>();
            AmisModel amisModel = new AmisModel().setModelClass(modelClass.getSimpleName());
            if (CollectionUtils.isEmpty(amisModels)) {
                //不存在则新增
                for (int i = 0; i < modelClass.getDeclaredFields().length; i++) {
                    Field field = modelClass.getDeclaredFields()[i];
                    if (field.isAnnotationPresent(Comment.class)) {
                        amisModelFields.add(new AmisModelField()
                                .setAmisModel(amisModel)
                                .setFieldName(field.getName())
                                .setComment(field.getAnnotation(Comment.class).value())
                                .setOrderNum(i));
                    }
                }
            } else {
                //存在记录则更新
                amisModel = amisModels.get(0);
                List amisModelFieldList = amisModel.getAmisModelFieldList();
                //新数据根据某唯一字段处理成map集合
                Map fieldMap = amisModelFieldList.stream().collect(Collectors.toMap(AmisModelField::getFieldName, t -> t));
                //旧数据删除不存在的字段记录
                List fields = ListUtil.of(modelClass.getDeclaredFields()).stream().map(Field::getName).collect(Collectors.toList());
                List delFields = amisModelFieldList.stream().filter(t -> !fields.contains(t.getFieldName())).collect(Collectors.toList());
                if(CollectionUtils.isNotEmpty(delFields)){
                    amisModelFieldDao.deleteAllInBatch(delFields);
                }
                for (int i = 0; i < modelClass.getDeclaredFields().length; i++) {
                    Field field = modelClass.getDeclaredFields()[i];
                    if (field.isAnnotationPresent(Comment.class)) {
                        if (fieldMap.get(field.getName()) == null) {
                            //一对多,多方新增
                            amisModelFields.add(new AmisModelField()
                                    .setAmisModel(amisModel)
                                    .setFieldName(field.getName())
                                    .setComment(field.getAnnotation(Comment.class).value())
                                    .setOrderNum(i));
                        } else {
                            //一对多,多方更新
                            amisModelFields.add(fieldMap.get(field.getName())
                                    .setComment(field.getAnnotation(Comment.class).value())
                                    .setOrderNum(i));
                        }
                    }
                }
            }
            amisModel.setAmisModelFieldList(amisModelFields);
            amisModelDao.saveAndFlush(amisModel);

你可能感兴趣的:(java,java,stream,一对多,增删改查)