我有一个类似于
的课程public class ABLink {
private Long aId;
private Long bId;
}
此类在数据库(Postgresql)中有一个对应的实体,如下所示:
CREATE TABLE a_b_link(
a_id BIGINT NOT NULL,
b_id BIGINT NOT NULL,
CONSTRAINT a_b_link_pk
PRIMARY KEY (a_id, b_id)
);
我正试图以这样的方式使用jooq loader api执行批量插入:
dsl.loadInto(A_B_LINK).batchAll()
.onDuplicateKeyUpdate()
.loadRecords(records)
.fields(A_B_LINK.fields())
.execute();
因为我试图为插入这样的逻辑制作批处理:
insertInto(A_B_LINK).set(record).onDuplicateKeyUpdate().set(record).execute()
但我遇到过如下错误:
Batch entry 0 insert into "schema"."a_b_link" ("a_id", "b_id") values (3273, 8) on conflict ("a_id", "b_id") do update set [ no fields are updated ] was aborted: ERROR: syntax error at or near "["
因为没有要更新的字段。只有这个ids。我已尝试在loader api中使用onDuplicateKeyUpdate批处理,但收到错误:
Cannot apply batch loading with onDuplicateKeyIgnore flag.
我试图在没有任何重复密钥策略的情况下执行批处理,例如:
dsl.loadInto(A_B_LINK).batchAll()
.loadRecords(records)
.fields(A_B_LINK.fields())
.execute();
当然,我会不时收到违规例外情况。
我将非常感谢与此问题相关的任何帮助,建议或提示。
答案 0 :(得分:0)
出现此错误的原因是,如果您的表仅包含属于主键的字段,则不会更新任何字段。
有两种方法可以“解决”这个问题:
onDuplicateKeyUpdate()
,而是使用onDuplicateKeyIgnore()
。你在标题中提到过,但在代码中却没有。请注意,目前(从jOOQ 3.10开始),不支持batchAll()
和onDuplicateKeyIgnore()
的组合,不幸的是:https://github.com/jOOQ/jOOQ/issues/7253