一种主子表的update方法

更新

方法

这段代码展示了一个较为复杂的更新方法,主要用于更新一个主表 `OnsiteExamination` 及其关联的子表。整体流程可以分为以下几个步骤:

1. 获取更新参数
   - `Long id = updateParam.getId();`
   - `Long tenantId = updateParam.getTenantId();`
     
     这两个变量分别对应主表记录的 ID 和租户 ID。

 2. 将更新参数转换为数据对象
   - `OnsiteExaminationDO onsiteExaminationDO = OnsiteExaminationConverter.updateParamToDO(updateParam);`
     
     这里将传入的更新参数 `updateParam` 转换为数据对象 `OnsiteExaminationDO`,方便后续操作。

 3. 查询旧数据
   - `List<ExaminationTeamModel> examinationTeamModels = examinationTeamService.listByExaminationId(id, tenantId);`
   - `List<ExaminationProjectModel> examinationProjectModels = examinationProjectService.listByExaminationId(id, tenantId);`
   - `List<ExaminationFileModel> examinationFileModels = examinationFileService.listByExaminationId(id, tenantId);`
     
     分别查询出与主表关联的子表(`ExaminationTeamModel`, `ExaminationProjectModel`, `ExaminationFileModel`)的旧数据。这些数据将在后续步骤中用于比较,以确定哪些数据需要删除或更新。

4. 获取新数据并转换为 Map
   - `List<ExaminationTeamUpdateParam> examinationTeamUpdateParams = updateParam.getExaminationTeams();`
   - `Map<Long, ExaminationTeamUpdateParam> examinationTeamUpdateParamMap = CollectionHelper.collectMap(examinationTeamUpdateParams, ExaminationTeamUpdateParam::getId);`

   - `List<ExaminationProjectUpdateParam> examinationProjectUpdateParams = updateParam.getExaminationProjects();`
   - `Map<Long, ExaminationProjectUpdateParam> examinationProjectUpdateParamMap = CollectionHelper.collectMap(examinationProjectUpdateParams, ExaminationProjectUpdateParam::getId);`

   - `List<ExaminationFileUpdateParam> examinationFileUpdateParams = updateParam.getExaminationFiles();`
   - `Map<Long, ExaminationFileUpdateParam> examinationFileUpdateParamMap = CollectionHelper.collectMap(examinationFileUpdateParams, ExaminationFileUpdateParam::getId);`
     
     这里将传入的子表更新参数列表转换为 Map,Map 的 Key 是子表记录的 ID,Value 是对应的更新参数。这种结构便于后续进行数据的对比和更新。

5. 比较旧数据与新数据,确定需要删除的记录
   - `List<Long> examinationTeamDeleteIds = OnsiteExaminationConverter.getTeamDeleteIds(examinationTeamModels, examinationTeamUpdateParamMap);`
   - `List<Long> examinationProjectDeleteIds = OnsiteExaminationConverter.getProjectDeleteIds(examinationProjectModels, examinationProjectUpdateParamMap);`
   - `List<Long> examinationFileDeleteIds = OnsiteExaminationConverter.getFileDeleteIds(examinationFileModels, examinationFileUpdateParamMap);`
     
     通过比较旧数据和新数据的 Map,确定哪些子表记录需要从数据库中删除。`getTeamDeleteIds`, `getProjectDeleteIds`, `getFileDeleteIds` 这些方法可能实现了一种逻辑,即如果新数据中不包含某个旧数据的 ID,则认为该旧数据需要删除。

6. 记录操作日志
   - `OperationLogSaveParam operationLogSaveParam = OnsiteExaminationConverter.toOperationLogSaveParam(onsiteExaminationDO, LogOperateTypeEnum.UPDATE);`
   - `operationLogService.save(operationLogSaveParam);`
     
     记录本次操作的日志,通常用于审计或追踪目的。`LogOperateTypeEnum.UPDATE` 表示这是一次更新操作。

 7. 执行更新操作
   - `onsiteExaminationRepository.update(onsiteExaminationDO, examinationTeamUpdateParams, examinationProjectUpdateParams, examinationFileUpdateParams, examinationTeamDeleteIds, examinationProjectDeleteIds, examinationFileDeleteIds);`
     
     最终调用 `onsiteExaminationRepository` 的 `update` 方法,执行数据库的更新操作。该方法会根据传入的主表数据对象、子表更新参数、以及需要删除的子表记录 ID 列表,来完成数据库的更新操作。

 总结
这个方法的核心思想是**先查询旧数据**,然后**比较旧数据与新数据**,确定哪些数据需要更新,哪些数据需要删除,最后**批量执行数据库操作**。这种方法在处理包含多个关联子表的复杂更新操作时非常有效,可以确保数据的一致性和完整性。

@Overridepublic void update(OnsiteExaminationUpdateParam updateParam) {Long id = updateParam.getId();Long tenantId = updateParam.getTenantId();OnsiteExaminationDO onsiteExaminationDO = OnsiteExaminationConverter.updateParamToDO(updateParam);// 查出附属表旧数据List<ExaminationTeamModel> examinationTeamModels = examinationTeamService.listByExaminationId(id, tenantId);List<ExaminationProjectModel> examinationProjectModels = examinationProjectService.listByExaminationId(id, tenantId);List<ExaminationFileModel> examinationFileModels = examinationFileService.listByExaminationId(id, tenantId);// 获取附属表新数据List<ExaminationTeamUpdateParam> examinationTeamUpdateParams = updateParam.getExaminationTeams();Map<Long, ExaminationTeamUpdateParam> examinationTeamUpdateParamMap = CollectionHelper.collectMap(examinationTeamUpdateParams, ExaminationTeamUpdateParam::getId);List<ExaminationProjectUpdateParam> examinationProjectUpdateParams = updateParam.getExaminationProjects();Map<Long, ExaminationProjectUpdateParam> examinationProjectUpdateParamMap = CollectionHelper.collectMap(examinationProjectUpdateParams, ExaminationProjectUpdateParam::getId);List<ExaminationFileUpdateParam> examinationFileUpdateParams = updateParam.getExaminationFiles();Map<Long, ExaminationFileUpdateParam> examinationFileUpdateParamMap = CollectionHelper.collectMap(examinationFileUpdateParams, ExaminationFileUpdateParam::getId);// 比较得出要删除的idList<Long> examinationTeamDeleteIds = OnsiteExaminationConverter.getTeamDeleteIds(examinationTeamModels, examinationTeamUpdateParamMap);List<Long> examinationProjectDeleteIds = OnsiteExaminationConverter.getProjectDeleteIds(examinationProjectModels, examinationProjectUpdateParamMap);List<Long> examinationFileDeleteIds = OnsiteExaminationConverter.getFileDeleteIds(examinationFileModels, examinationFileUpdateParamMap);OperationLogSaveParam operationLogSaveParam = OnsiteExaminationConverter.toOperationLogSaveParam(onsiteExaminationDO, LogOperateTypeEnum.UPDATE);operationLogService.save(operationLogSaveParam);onsiteExaminationRepository.update(onsiteExaminationDO, examinationTeamUpdateParams, examinationProjectUpdateParams,examinationFileUpdateParams, examinationTeamDeleteIds, examinationProjectDeleteIds,examinationFileDeleteIds);}

比较出要删除ids的方法如下

   public static List<Long> getTeamDeleteIds(List<ExaminationTeamModel> examinationTeamModels, Map<Long, ExaminationTeamUpdateParam> examinationTeamUpdateParamMap) {// 对比出删除的现场考察数据return CollectionHelper.collectNotNullList(examinationTeamModels, param -> {Long teamId = param.getId();ExaminationTeamUpdateParam examinationTeamUpdateParam = MapHelper.getValue(examinationTeamUpdateParamMap, teamId);if (examinationTeamUpdateParam == null) {return teamId;}return null;});}

仓储层update逻辑

  @HussarTransactionalpublic void update(OnsiteExaminationDO onsiteExaminationDO, List<ExaminationTeamUpdateParam> examinationTeamUpdateParams, List<ExaminationProjectUpdateParam> examinationProjectUpdateParams,List<ExaminationFileUpdateParam> examinationFileUpdateParams, List<Long> examinationTeamDeleteIds, List<Long> examinationProjectDeleteIds, List<Long> examinationFileDeleteIds) {Long examinationId = onsiteExaminationDO.getId();Long tenantId = onsiteExaminationDO.getTenantId();onsiteExaminationMapper.updateById(onsiteExaminationDO);examinationTeamUpdateParams = CollectionHelper.collectNotNullList(examinationTeamUpdateParams, param -> {param.setExaminationId(examinationId);param.setTenantId(tenantId);return param;});if (CollectionUtils.isNotEmpty(examinationTeamUpdateParams)) {examinationTeamService.saveOrUpdateBatch(examinationTeamUpdateParams);}if (CollectionUtils.isNotEmpty(examinationTeamDeleteIds)) {examinationTeamService.deleteBatchByIds(examinationTeamDeleteIds, tenantId);}examinationProjectUpdateParams = CollectionHelper.collectNotNullList(examinationProjectUpdateParams, param -> {param.setExaminationId(examinationId);param.setTenantId(tenantId);return param;});if (CollectionUtils.isNotEmpty(examinationProjectUpdateParams)) {examinationProjectService.saveOrUpdateBatch(examinationProjectUpdateParams);}if (CollectionUtils.isNotEmpty(examinationProjectDeleteIds)) {examinationProjectService.deleteBatchByIds(examinationProjectDeleteIds, tenantId);}examinationFileUpdateParams = CollectionHelper.collectNotNullList(examinationFileUpdateParams, param -> {param.setExaminationId(examinationId);param.setTenantId(tenantId);return param;});if (CollectionUtils.isNotEmpty(examinationFileUpdateParams)) {examinationFileService.saveOrUpdateBatch(examinationFileUpdateParams);}if (CollectionUtils.isNotEmpty(examinationFileDeleteIds)) {examinationFileService.deleteBatchByIds(examinationFileDeleteIds, tenantId);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/15437.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Siggraph Asia 2024 | Adobe发布MagicClay:可通过文字引导去对3D模型中的特定部分进行雕刻

今天给大家介绍一篇来自Adobe研究人员在Siggraph Asia 2024上发表的最新工作MagicClay&#xff0c;它是一款结合网格和距离场(SDF)的混合式工具&#xff0c;可以通过文字引导去对3D模型中的特定部分进行雕刻。允许艺术家通过文字提示进行局部网格编辑&#xff0c;支持生成具纹理…

滑动窗口的使用

一、定义与基本原理 滑动窗口是一种流量控制技术&#xff0c;也用于管理和处理数据流。它通过定义一个固定大小或可根据特定条件动态调整的窗口&#xff0c;在数据流或数据序列上滑动&#xff0c;以便高效地处理其中的数据。这种技术能够限制同时处理的数据量&#xff0c;从而…

Python学习26天

集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num&#xff1a;{num}\nnum数据类型为&#xff1a;{type(num)}") # 求集合中元素个数 print(f"num中元素个数为&#xff1a;{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…

android开发

文章目录 android开发 类微信界面整体框架展示&#xff1a;主页Fragment_MainActivity2&#xff1a;1. 聊天界面2. 用户界面用户界面的跳转 3. 朋友圈界面4. 我的界面 android开发 类微信界面 整体效果展示&#xff1a; 整体框架展示&#xff1a; 4个主要的fragment页面&#…

【大数据学习 | flume】flume的概述与组件的介绍

1. flume概述 Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 Flume两个版本区别&#xff1a; ​ 1&…

vmware安装Ubuntu桌面版系统

1安装环境 vmware版本&#xff1a;VMware Workstation 17 Ubuntu版本&#xff1a;ubuntu-24.04.1-desktop-amd64.iso 文档时间&#xff1a;2024年11月 每一个Ubuntu的版本安装显示可能不一样&#xff0c;但安装方法是类似的 2镜像下载 Ubuntu官网&#xff1a;[https://ubun…

STL--map、set的使用和模拟实现

1.set 1.1 set的概念 set 是一种基于 平衡二叉搜索树&#xff08;通常是红黑树&#xff09; 实现的容器&#xff0c;它提供了有序集合的功能。set 用于存储唯一的元素&#xff0c;并且元素是按照某种顺序排列的&#xff08;通常是升序&#xff09;。 set 确实是一个关联式容…

软件测试之什么是缺陷

软件测试之什么是缺陷 1. 缺陷定义2. 缺陷判定标准3. 缺陷产生原因3.1 缺陷产生的原因3.2 缺陷的生命周期 4. 缺陷核心内容5. 缺陷提交要素6. 缺陷类型 1. 缺陷定义 软件在使用过程中存在的任何问题都叫软件的缺陷, 简称Bug. 2. 缺陷判定标准 3. 缺陷产生原因 3.1 缺陷产生的…

二叉树的遍历(手动)

树的遍历分四种&#xff1a; 层序遍历 前序遍历 中序遍历 后序遍历 层序遍历&#xff1a; 很好理解&#xff0c;就是bfs嘛&#xff08;二不二叉都行&#xff09; 前序遍历&#xff1a; 又叫先跟遍历&#xff0c;遍历顺序是根->左->右&#xff08;子树里也是&#…

Unix进程

文章目录 命令行参数进程终止正常结束异常终止exit和_exitatexit 环境变量环境变量性质环境表shell中操作环境变量查看环境变量设置环境变量 环境变量接口获取环境变量设置环境变量 环境变量的继承性 进程资源shell命令查看进程的资源限制 进程关系进程标识进程组会话控制终端控…

供应链管理、一件代发系统功能及源码分享 PHP+Mysql

随着电商行业的不断发展&#xff0c;传统的库存管理模式已经逐渐无法满足市场需求。越来越多的企业选择“一件代发”模式&#xff0c;即商家不需要自己储备商品库存&#xff0c;而是将订单直接转给供应商&#xff0c;由供应商直接进行发货。这种方式极大地降低了企业的运营成本…

关于离散模型优化的一份介绍

离散模型优化是运筹学和计算机科学领域中的一个重要分支&#xff0c;它主要研究如何在有限的、通常是计数的决策变量空间中寻找最优解。这类问题通常出现在资源分配、生产计划、物流管理、网络设计等实际应用场景中。在这篇文章中就将介绍离散模型优化中关于线性规划等部分内容…

hadoop_yarn详解

YARN秒懂 YARN定义基础架构ResourceManagerNodeManagerApplicationMasterContainer 工作流程资源调度器FIFO SchedulerCapacity SchedulerFair Scheduler 常用命令 YARN定义 YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Hadoop的一个框架&#xff0c;它负责…

【MYSQL】数据库日志 (了解即可)

一、错误日志 可以通过 tail查看文件的日志的&#xff0c;如果发生错误&#xff0c;就会在日志里出现问题。 二、二进制日志&#xff08;binlog&#xff09; BINLOG记录了insert delete update 以及 alter create drop 等语句。作用是灾难时的数据恢复&#xff0c;还有就是主…

接口测试整体框架

接口测试 1. 接口 接口&#xff0c;也叫api&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;&#xff0c;接口&#xff08;Interface&#xff09;是指不同软件组件或系统之间进行交互的点。接口定义了组件之间如何通信&#xff0c;包括…

递归搜索与回溯算法

递归搜索与回溯算法 名词解释 递归 在解决⼀个规模为n的问题时&#xff0c;如果满⾜以下条件&#xff0c;我们可以使⽤递归来解决&#xff1a; a. 问题可以被划分为规模更⼩的⼦问题&#xff0c;并且这些⼦问题具有与原问题相同的解决⽅法。 b. 当我们知道规模更⼩的⼦问题&…

基于java+SpringBoot+Vue的中小型医院网站设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

图神经网络研究综述(GNN),非常详细收藏我这一篇就够了!

图神经网络由于其在处理非欧空间数据和复杂特征方面的优势&#xff0c;受到广泛关注并应用于推荐系统、知识图谱、交通道路分析等场景。 大规模图结构的不规则性、节点特征的复杂性以及训练样本的依赖性给图神经网络模型的计算效率、内存管理以及分布式系统中的通信开销带来巨…

36.安卓逆向-壳-脱壳实战

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。第一…

办公耗材管理新纪元:系统化解企业挑战,助力高效运营

在当今竞争激烈的商业环境中&#xff0c;无论是大型企业还是中小型企业&#xff0c;办公耗材管理都是关乎企业运营效率与成本控制的关键环节。有效的办公耗材管理不仅能显著降低运营成本&#xff0c;还能提升整体工作效率&#xff0c;确保业务的顺畅进行。然而&#xff0c;许多…