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()))
如何在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()))
然后,您必须使用
单独绑定您的 IDfor (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()))