我正在尝试使用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, 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串)“ 很明显,当我尝试调整文档中的示例时,输入错误。
答案 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()
?