如何使用JOOQ将Data表记录复制到结构相似的DataDraft表
用JOOQ实现Data表记录到DataDraft表的迁移(无需逐个字段复制)
方法一:利用Record.into()对象转换(单条/小批量场景)
如果两张表的字段名、数据类型基本匹配,可直接通过JOOQ的Record.into()完成对象转换:
- 读取Data表指定记录:
// 假设已初始化DSLContext实例dsl DataRecord dataRecord = dsl.selectFrom(DATA) .where(DATA.ID.eq(123)) .fetchOne();
- 转换并插入DataDraft表:
if (dataRecord != null) { // 自动映射匹配字段 DataDraftRecord draftRecord = dataRecord.into(DataDraftRecord.class); // 若存在少量差异字段(如DataDraft新增的create_time),手动补充 draftRecord.setCreateTime(LocalDateTime.now()); // 执行插入 draftRecord.insert(); }
批量场景可结合流处理+批量插入提升效率:
List<DataRecord> dataRecords = dsl.selectFrom(DATA) .where(DATA.STATUS.eq("VALID")) .fetch(); List<DataDraftRecord> draftRecords = dataRecords.stream() .map(r -> r.into(DataDraftRecord.class)) .peek(r -> r.setCreateTime(LocalDateTime.now())) .collect(Collectors.toList()); dsl.batchInsert(draftRecords).execute();
方法二:构造INSERT...SELECT语句(大数据量高效迁移)
无需将数据加载到Java内存,直接通过数据库层面的语句完成迁移,性能最优:
dsl.insertInto(DATA_DRAFT) // 字段完全一致时可省略columns(),直接select(*) .columns(DATA_DRAFT.ID, DATA_DRAFT.NAME, DATA_DRAFT.CONTENT) .select( select(DATA.ID, DATA.NAME, DATA.CONTENT) .from(DATA) .where(DATA.CREATE_TIME.greaterThan(LocalDate.now().minusDays(7))) ) .execute();
字段不完全匹配的处理方案
若存在少量字段名/类型差异,可手动指定映射关系:
// 示例:Data表的CONTENT字段对应DataDraft表的DETAIL字段 dsl.insertInto(DATA_DRAFT) .columns(DATA_DRAFT.ID, DATA_DRAFT.NAME, DATA_DRAFT.DETAIL) .select( select( DATA.ID, DATA.NAME, DATA.CONTENT.map(DATA_DRAFT.DETAIL) // 显式字段映射 ) .from(DATA) .where(DATA.ID.eq(123)) ) .execute();
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

