如何在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
相关产品推荐
相关产品推荐

