2013-07-04 205 views
1

我试图使用jOOQ批量插入到我的postgres数据库中。 我试图做的是:jooq批量插入问题(复制第一行)

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 ...)的运气,以通过值(...)步骤,希望由于这些“值”并非真正的 值,我想批量插入,他们得到稍后被绑定覆盖。

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

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

有没有人试图使用jOOQ进行批量插入,以及如何不插入第一行两次?

P.S.当我尝试使用 .values(“?”,“?”,“?”,“?”,“?”,“?”,“?”,“?”,“?”,“?” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” :字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,双字符串,双字符串,字符串,字符串,字符串,字符串,时间戳,字符串,字符串, String, String, String,String,String) InsertValuesStep22不适用于参数(String,String,String,String,String,String,String,String,String,String,String,String,String,String, String,String,String,String ,字符串,字符串,字符串,字符串)“ 显然,当我尝试修改文档中的示例时,输入是错误的。

+0

看起来这个文档已经过时了,从之前的3版本开始。0“版本,其中'values()'子句的静态类型尚未实施。你可以提供一个例子如何重现插入第一行两次?这确实令人惊讶...... –

回答

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()