1

我正在尝试使用 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(...) 作为最后一次调用。在文档中指出,“?” 必须使用。这是作为字符串类型的,并且可能仅适用于所有列都是 varchars 的表,因为 jOOQ 进行静态类型。这让我很恼火。我尝试使用任意默认值 (null,0...) 只是为了通过 values(...) 步骤,希望由于这些“值”不是我想要批量插入的真正值,它们会被覆盖后来被绑定。

事实上,他们会的。第一行两次。这完全让我感到困惑。

重复一遍,我可以进行批量插入,但第一行被插入两次。我的直觉是它与“值”调用有关(至少 DSL 中存在与打字有关的概念问题)。

有没有人尝试使用 jOOQ 进行批量插入,如果没有两次插入第一行,如何做到这一点?

PS 当我尝试使用 .values("?", "?", "?", "?", "?", "?", "?", "?", "?","?" ,"?","?","?","?","?","?","?","?","?","?","?","?") : "方法值(Integer, String, String, String, String, String, String, String, String, String, Double, Double, String, String, String, String, Timestamp, String, String, String, String, String) in InsertValuesStep22 类型不适用于参数(字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, String, String)" 很明显,打错了,当我尝试改编文档中的示例时。

4

1 回答 1

2

文档中的示例是错误的。现在已修复

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()了太多次?

于 2013-07-06T11:59:34.523 回答