You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在insert()与onConflict()之间共享set语句?

提取jOOQ中Insert/Update共享的Set语句

你在jOOQ的UPSERT(插入冲突则更新)操作里,Insert和Update部分重复了大量set()调用,想要把这些重复逻辑提取成可复用的代码块,类似DSL.condition()复用where条件的方式,这里提供几种可行方案:

方案一:使用Record对象(最简洁)

jOOQ的UpdatableRecord可以直接承载所有字段值,只需构建一次,Insert和Update阶段直接复用即可:

// 一次性构建Record对象,填充所有字段值
RAID_V2Record record = db.newRecord(RAID_V2);
record.setHANDLE(handle);
record.setSERVICE_POINT_ID(servicePointId);
record.setURL(raidUrl);
record.setURL_INDEX(urlContentIndex);
record.setPRIMARY_TITLE(primaryTitle);
record.setMETADATA(jsonbMetadata);
record.setMETADATA_SCHEMA(mapJs2Jq(metadata.getMetadataSchema()));
record.setSTART_DATE(startDate);
record.setDATE_CREATED(LocalDateTime.now());
record.setCONFIDENTIAL(confidential);

// 执行UPSERT,直接复用record
db.insertInto(RAID_V2)
   .set(record)
   .onConflict(RAID_V2.HANDLE)
   .doUpdate()
   .set(record)
   .where(RAID_V2.HANDLE.eq(handle))
   .execute();

方案二:自定义通用Set配置函数

如果不想使用Record,可以封装一个函数,利用jOOQ的CommonSetStep统一处理Insert和Update的set逻辑:

// 封装复用的set逻辑,兼容InsertSetStep和UpdateSetStep
private <T extends CommonSetStep<T>> T applyRaidSetValues(T step) {
    return step.set(RAID_V2.HANDLE, handle)
               .set(RAID_V2.SERVICE_POINT_ID, servicePointId)
               .set(RAID_V2.URL, raidUrl)
               .set(RAID_V2.URL_INDEX, urlContentIndex)
               .set(RAID_V2.PRIMARY_TITLE, primaryTitle)
               .set(RAID_V2.METADATA, jsonbMetadata)
               .set(RAID_V2.METADATA_SCHEMA, mapJs2Jq(metadata.getMetadataSchema()))
               .set(RAID_V2.START_DATE, startDate)
               .set(RAID_V2.DATE_CREATED, LocalDateTime.now())
               .set(RAID_V2.CONFIDENTIAL, confidential);
}

// 调用时复用逻辑
applyRaidSetValues(db.insertInto(RAID_V2))
   .onConflict(RAID_V2.HANDLE)
   .doUpdate()
   .let(this::applyRaidSetValues)
   .where(RAID_V2.HANDLE.eq(handle))
   .execute();

方案三:用DSL.set()批量构建集合

和你熟悉的DSL.condition()复用where条件逻辑类似,提前构建所有set操作的集合,两处直接复用:

// 提前构建所有set操作的集合
Collection<Set<?>> setValues = Arrays.asList(
    DSL.set(RAID_V2.HANDLE, handle),
    DSL.set(RAID_V2.SERVICE_POINT_ID, servicePointId),
    DSL.set(RAID_V2.URL, raidUrl),
    DSL.set(RAID_V2.URL_INDEX, urlContentIndex),
    DSL.set(RAID_V2.PRIMARY_TITLE, primaryTitle),
    DSL.set(RAID_V2.METADATA, jsonbMetadata),
    DSL.set(RAID_V2.METADATA_SCHEMA, mapJs2Jq(metadata.getMetadataSchema())),
    DSL.set(RAID_V2.START_DATE, startDate),
    DSL.set(RAID_V2.DATE_CREATED, LocalDateTime.now()),
    DSL.set(RAID_V2.CONFIDENTIAL, confidential)
);

// 执行UPSERT,直接复用set集合
db.insertInto(RAID_V2)
   .set(setValues)
   .onConflict(RAID_V2.HANDLE)
   .doUpdate()
   .set(setValues)
   .where(RAID_V2.HANDLE.eq(handle))
   .execute();

内容的提问来源于stack exchange,提问作者Shorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:45:43