You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:15:06