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

JOOQ插入数据后普通自动生成列无返回值,求最优解决方法

问题:插入数据后无法获取自动生成的created字段值

表结构

我有一张user_profile表,包含以下字段:

  • id:UUID类型,主键,非空,自动生成
  • created:TIMESTAMP类型,非空,自动生成
  • name:VARCHAR类型

原插入代码(Kotlin)

// dsl是由Spring Boot注入的DslContext Bean
dsl.newRecord(Tables.USER_PROFILE).apply {
    name = "My Name"
    insert()
// UserProfile是由JOOQ生成的不可变POJO类
}.into(UserProfile::class.java)

执行上述代码后,生成的POJO中主键id能拿到自动生成的值,但created字段始终为null,请问获取该字段值的最优方法是什么?


解决方案

最优方法:用returning()指定返回字段

JOOQ默认只自动返回主键的生成值,要拿到非主键的自动生成字段,只需在插入时通过returning()明确指定需要返回的字段,这样插入和字段返回是一次数据库交互,性能最优:

val userProfile = dsl.insertInto(Tables.USER_PROFILE)
    .set(Tables.USER_PROFILE.NAME, "My Name")
    .returning(Tables.USER_PROFILE.ID, Tables.USER_PROFILE.CREATED)
    .fetchOne()
    ?.into(UserProfile::class.java)

备选方法:插入后查询(不推荐)

如果不想修改插入逻辑,也可以插入后根据已拿到的id再查询一次表获取created值,但这会多一次数据库请求,性能不如前者:

val record = dsl.newRecord(Tables.USER_PROFILE).apply {
    name = "My Name"
    insert()
}
val userProfile = dsl.selectFrom(Tables.USER_PROFILE)
    .where(Tables.USER_PROFILE.ID.eq(record.id))
    .fetchOne()
    ?.into(UserProfile::class.java)

原代码失效原因

原代码里的insert()方法默认仅追踪并返回主键的自动生成值,非主键的自动生成字段不会被自动填充到记录中,因此转换为POJO后created字段为null。

内容的提问来源于stack exchange,提问作者Xuan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:40:13