如何在 jooq 记录对象中设置当前数据库时间

how to set cuurent DB time in jooq record object

我已经通过代码生成器生成了 jooq 记录。在我的记录中,我有一个时间戳字段,我想将其设置为数据库当前数据时间。

以下作品:

MyRecord myrecord = new MyRecord();
myrecord.setCreateTime(Timestamp.from(Instant.now())); 

但是我想使用数据库时间,所以是这样的:(显然下面的语法有编译错误)

myrecord.set(MY_RECORD.CREATE_TIME, DSL.currentTimestamp());

实现此目标的最佳方法是什么?

直接使用jOOQ的INSERT语句,而不是UpdatableRecord

jOOQ 的 UpdatableRecord API doesn't allow for using SQL expressions as values, only actual values can be passed to the Record.set(Field<T>, T) 方法,设计使然。如果你想引入 SQL 表达式,你应该恢复使用经典的 SQL,例如一个 INSERT:

DSL.using(configuration)
   .insertInto(MY_TABLE)
   .set(...)
   .set(MY_TABLE.CREATE_TIME, DSL.currentTimestamp())
   .execute();

首选方法:使用SQL

另一种选择是求助于使用触发器或 SQL DEFAULT 表达式,您可以直接将它们放在 table 定义中。这样,无论您是通过 jOOQ 还是通过其他方式插入记录,都会生成当前时间戳。

"Another option would be to resort to using triggers or SQL DEFAULT expressions that you can put on the table definition directly"

同意,但根据您的应用程序 and/or 数据库平台,不需要求助于触发器。列可以设置为DEFAULT,例如

MY_COLUMN DATE DEFAULT SYSDATE

这仍然允许有人用 NULL 覆盖该值,或者您可以这样做

MY_COLUMN DATE DEFAULT ON NULL SYSDATE

设置默认值,即使明确请求 null。