栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JOOQ从表中获取记录并将其插入到另一个表中

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JOOQ从表中获取记录并将其插入到另一个表中

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.编写一个查询

该解决方案的优点是您只有一个查询,这意味着:

  1. 单个服务器往返(更少的延迟)
  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
列将通过当前的时间戳来代替。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/612123.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号