【问题标题】:java - jooq - how to bind array as param in jooq - PostgreSQLjava - jooq - 如何在 jooq 中将数组绑定为参数 - PostgreSQL
【发布时间】:2018-08-18 09:04:06
【问题描述】:

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

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

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

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

    query.bind("someIds", someIds);

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

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

【问题讨论】:

    标签: java arrays postgresql list jooq


    【解决方案1】:

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

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

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

    field("some.id").eq(any(someIds))
    

    动态IN 列表

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

    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]);
    

    或者,当然,您可以将它们直接绑定到谓词:

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

    【讨论】:

    • 感谢回复,最后我使用了 field("some.id").eq(any(someIds))
    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多