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
相关产品推荐
相关产品推荐

