我通过代码生成器生成了jooq记录。在我的记录中,我有一个时间戳字段,我想将其设置为DB当前数据时间。
以下作品:
ByteBuf#arrayOffset
但是我想使用DB时间,所以这样的事情:(显然在下面的语法中存在编译错误)
MyRecord myrecord = new MyRecord();
myrecord.setCreateTime(Timestamp.from(Instant.now()));
实现这一目标的最佳方法是什么?
答案 0 :(得分:2)
INSERT
语句,而不是UpdatableRecord
jOOQ' UpdatableRecord
API不允许将SQL表达式用作值,只有实际值可以通过设计传递给Record.set(Field<T>, T)
方法。如果您希望引入SQL表达式,则应该恢复使用经典SQL,例如: INSERT
:
DSL.using(configuration)
.insertInto(MY_TABLE)
.set(...)
.set(MY_TABLE.CREATE_TIME, DSL.currentTimestamp())
.execute();
另一个选择是使用可以直接放在表定义上的触发器或SQL DEFAULT
表达式。这样,无论您是通过jOOQ还是通过其他方式插入记录,都会生成当前时间戳。
答案 1 :(得分:2)
“另一个选择是使用触发器或SQL DEFAULT表达式直接放在表定义上”
同意,但根据您的应用程序和/或数据库平台,不应该使用触发器。列可以设置为DEFAULT,例如
MY_COLUMN DATE DEFAULT SYSDATE
仍然允许某人用NULL覆盖值,或者你可以
MY_COLUMN DATE DEFAULT ON NULL SYSDATE
即使显式请求null,也要将默认值设置到位。