gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:08:25 26 4
gpt4 key购买 nike

如何在jooq的查询中绑定(bind)一个数组作为参数?

这是我添加名为“someIds”的命名参数的地方

    Query query = selectJoinStep.where(field("some.id").in(param("someIds")));

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

    query.bind("someIds", someIds);

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

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

最佳答案

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

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

您收到特定错误消息的原因是 jOOQ 尝试将实际数组绑定(bind)变量绑定(bind)到单个参数。您可能知道,PostgreSQL 支持数组,如果您绑定(bind)了一个 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()))

然后,您将不得不使用单独绑定(bind)您的 ID

for (int i = 0; i < someIds.length; i++)
query.bind("someId" + i, someIds[i]);

或者,当然,您将它们直接绑定(bind)到谓词中:

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

关于java - jooq - 如何在 jooq 中将数组绑定(bind)为参数 - PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49199733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com