我在JOOQ api中发现了一种奇怪的方法。
Batch batch(Query query, Object[]... bindings);
我很好奇如何在不手动指定参数的情况下调用它。
public int g(Object[]... args) {
return args.length;
}
失败:
assertEquals(2, g(new Object[] { new Object[0], new Object[0] }));
答案 0 :(得分:1)
API的目的是以矩阵形式为批处理语句提供一组绑定值,其中每个外部数组元素对应于批处理中的单个语句,并且每个内部数组元素对应于绑定值。 / p>
有几种方法。让我们在这里假设这个问题:
Query query = DSL.query("INSERT INTO t(a, b) VALUES (?, ?)", null, null);
E.g。在Java中使用经典矩阵创建(varargs在这里没有用):
batch(query, new Object[][] {
{ 1, "a" }, // Record 1 to insert
{ 2, "b" }, // Record 2 to insert
{ 3, "c" } // Record 3 to insert
});
或者,通过使用单个数组(这是varargs可以帮助的地方):
batch(query,
new Object[] { 1, "a" }, // Record 1 to insert
new Object[] { 2, "b" }, // Record 2 to insert
new Object[] { 3, "c" } // Record 3 to insert
);
如果您有一些预先存在的jOOQ记录结构,并且您希望将它们作为绑定变量传递给批处理,则后者特别有用,例如:使用Record.intoArray()
:
batch(query,
record1.intoArray(),
record2.intoArray(),
record3.intoArray()
);
答案 1 :(得分:0)
您的测试失败,因为Java隐式创建了三点符号的数组。在你的情况下,方法g得到一个带有一个元素的数组,这个数组的第一个元素又是一个数组(你的数组有两个Object
实例)。
因此您可以省略其他数组:
assertEquals(2, g(new Object[0], new Object[0]));
所以你可以通过传递带有显式数组的vararg参数来使用batch()
方法:
batch(query, new Object(), new Object())