如何在JOOQ批量更新中返回所有受影响行?
解决JOOQ批量更新并返回所有受影响行的编译问题
你的代码编译失败的核心原因是:batchUpdate()方法接收的参数是UpdatableRecord类型实例,而你当前生成的是UpdateReturningStep类型的更新语句对象,两者类型不匹配。
下面提供两种可行的解决方案:
方案一:使用batch()直接执行带returning的批量更新(推荐)
这种方式无需提前查询数据,直接批量执行更新语句并获取返回结果,性能更优:
fun updateStatuses(writeOffRequestsIds: Collection<UUID>, status: WriteOffRequestStatus): List<WriteOffRequest> { val updateQueries = writeOffRequestsIds.map { id -> db.update(WRITE_OFF_REQUEST) .set(WRITE_OFF_REQUEST.STATUS, status) .set(WRITE_OFF_REQUEST.UPDATED_AT, LocalDateTime.now()) .where(WRITE_OFF_REQUEST.ID.eq(id)) .returning() } return db.batch(*updateQueries.toTypedArray()) .execute() .flatMap { result -> result.into(WriteOffRequest::class.java).toList() } }
方案二:通过UpdatableRecord实现批量更新
如果需要在更新前对记录做额外处理,可以先加载对应记录,修改后再批量更新:
fun updateStatuses(writeOffRequestsIds: Collection<UUID>, status: WriteOffRequestStatus): List<WriteOffRequest> { // 加载需要更新的记录 val records = db.selectFrom(WRITE_OFF_REQUEST) .where(WRITE_OFF_REQUEST.ID.`in`(writeOffRequestsIds)) .fetch() // 修改记录字段 records.forEach { record -> record[WRITE_OFF_REQUEST.STATUS] = status record[WRITE_OFF_REQUEST.UPDATED_AT] = LocalDateTime.now() } // 批量更新并转换为目标实体类 return db.batchUpdate(*records.toTypedArray()) .map { it.into(WriteOffRequest::class.java) } }
内容的提问来源于stack exchange,提问作者Daniil Spirin
相关产品推荐
相关产品推荐

