jooq批量插入问题(复制第一行)

时间:2013-07-04 08:48:50

标签: java sql batch-file insert jooq

我正在尝试使用jOOQ将批量插入到我的postgres数据库中。 我想做的是:

BatchBindStep bbs = context.batch(context.insertInto(TABLENAME,FIELD1,FIELD2,....).values("?","?",...));
bbs = bbs.bind(v1a,v2a).bind(v1b,v2b)....;
bbs.execute();

http://www.jooq.org/doc/3.1/manual-single-page/#batch-execution

所述

为清楚起见,我想在一个查询中插入数千行,而不是使用包含数千个查询的批处理:

// 2. a single query
// -----------------
create.batch(create.insertInto(AUTHOR, ID, NAME).values("?", "?"))
.bind(1, "Erich Gamma")
.bind(2, "Richard Helm")
.bind(3, "Ralph Johnson")
.bind(4, "John Vlissides")
  .execute();

问题是: 为了达到BatchBindStep接受.bind()调用的程度,需要调用 带有参数的context.batch,它具有.values(...)作为最后一次调用。 在文件中说明,“?”必须使用。这是键入的字符串,并且可能仅适用于alls列为varchars的表,因为jOOQ执行静态类型。 这让我很恼火。我尝试使用任意默认值(null,0 ...)来运行值(...)步骤,希望因为这些“值”不是真的 我想要批量插入的值,它们稍后会被绑定覆盖。

事实上,他们会。 第一排是TWICE。这完全令我感到困惑。

重复一遍,我可以进行批量插入,但第一行插入TWICE。我有直觉,它与“值”调用有关(至少在DSL中有一个概念性的问题与输入)。

有没有人试图使用jOOQ进行批量插入,如果没有插入第一行两次呢?

P.S。当我尝试使用时会发生这种情况     .values(“?”,“?”,“?”,“?”,“?”,“?”,“?”,“?”,“?”,“?”,“?”,“?” “?”, “?”, “?”, “?”, “?”, “?”, “?”, “?”, “?”, “?”) : “方法值(Integer,String,String,String,String,String,String,String,String,String,Double,Double,String,String,String,String,Timestamp,String,String,String,  String,String)类型  InsertValuesStep22不适用于参数(String,String,String,String,String,String,String,String,String,String,String,String,String,String,  字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串)“ 很明显,当我尝试调整文档中的示例时,输入错误。

1 个答案:

答案 0 :(得分:1)

文档中的示例是错误的。它现在有been fixed

http://www.jooq.org/doc/latest/manual/sql-execution/batch-execution

原则上,正如您已经注意到的那样,将哪些伪绑定值传递给insert语句并不重要,因为在绑定各种.bind()调用指定的值时,这些值将被替换。所以原则上,一些正确的解决方案是:

// Passing in null
create.insertInto(AUTHOR, ID, NAME).values((Integer) null, null);

// Passing in a dummy value (even with a wrong type)
create.insertInto(AUTHOR, ID, NAME).values(Arrays.asList("?", "?"))

jOOQ集成测试表明批量插入工作正常。您在第一个记录的双重插入时遇到的问题将是令人惊讶的。这是一个从当前问题中看不到的微妙错误,或者您可能曾多次调用.bind()