如何调用数组的vararg方法?

时间:2017-03-10 13:12:30

标签: java jooq

我在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] }));

2 个答案:

答案 0 :(得分:1)

API是什么意思?

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