该
InsertSetStep.set(Record)方法不会将整个
person记录插入到目标表中,而是仅考虑值被“更改”的那些字段。参见Javadoc:
这
set(Map)与将参数记录视为a的调用相同Map<Field<?>,Object>,不同之处在于Record.changed()考虑这些标志以便仅更新更改的值。
因此,您可以通过多种方式解决此问题(当然,这里列出的内容比我列出的还要多):
1.将所有更改的标志设置为true
这将是最简单的解决方法:
// Insertperson.setDeactivatedOn(new Timestamp(System.currentTimeMillis()));person.changed(true); // Sets all flags to truegetContext().insertInto(PERSON_DEACTIVATED) .set(person) .execute();
2.编写一个查询
该解决方案的优点是您只有一个查询,这意味着:
- 单个服务器往返(更少的延迟)
- 更好的锁定语义(数据库知道您在做什么,因此出现竞争状况的机会更少)
因此,您可以编写:
getContext() .insertInto(PERSON_DEACTIVATED) .columns(PERSON_DEACTIVATED.fields()) .select( select(Arrays.stream(PERSON_DEACTIVATED.fields()).map(f -> f.equals(PERSON_DEACTIVATED.DEACTIVATED_ON) ? currentTimestamp() : PERSON.field(f)).collect(Collectors.toList())) .from(PERSON) .where(PERSON.ID.eq(id)) ) .execute();
与往常一样,此答案假定您的代码中包含以下静态导入:
import static org.jooq.impl.DSL.*;
上述查询将插入所有列从
PERSON成
PERSON_DEACTIVATED,除了
DEACTIVATED_ON列将通过当前的时间戳来代替。



