java - jooq - 如何在 jooq 中将数组绑定为参数 - PostgreSQL

java - jooq - how to bind array as param in jooq - PostgreSQL

如何在jooq的查询中绑定数组作为参数?

这是我添加名称为 'someIds'

的命名参数的地方
    Query query = selectJoinStep.where(field("some.id").in(param("someIds")));

我尝试了下面的行将数组绑定到参数

    query.bind("someIds", someIds);

但在生成的 sql 中,我得到的是对象的引用,而不是实际值,如下所示

some.id in ('[Ljava.lang.Object;@1fee4fe3')

为什么你的方法不起作用?

一个常见的误解是 SQL IN (?) 谓词可以某种方式支持数组绑定变量。这在我所知道的任何 SQL 方言中都是不可能的,你也不能用 jOOQ 这样做。 "this way" 是指指定一个绑定变量标记 (param) 并将多个 ID 绑定到它。

您收到该特定错误消息的原因是 jOOQ 试图将实际的数组绑定变量绑定到单个参数。你可能知道,PostgreSQL 支持数组,如果你绑定了一个 Integer[],那么 jOOQ 会把它传递给 PostgreSQL JDBC 驱动程序。事实上,也许这就是您在这里真正想通过使用 PostgreSQL 特定的 = ANY(?) 谓词

来完成的
field("some.id").eq(any(someIds))

动态IN 列表

为了拥有动态 IN-列表,您必须传递一个动态参数列表,例如

field("some.id").in(IntStream.range(0, someIds.length)
                             .mapToObj(i -> param("someId" + i))
                             .collect(Collectors.toList()))

然后,您必须使用

单独绑定您的 ID
for (int i = 0; i < someIds.length; i++)
    query.bind("someId" + i, someIds[i]);

或者,当然,您将它们直接绑定到 in-predicate:

field("some.id").in(IntStream.range(0, someIds.length)
                             .mapToObj(i -> param("someId" + i, i))
                             .collect(Collectors.toList()))