gpt4 book ai didi

postgresql - 使用 jOOQ 从 Postgres 数组中删除几个元素

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

我正在尝试使用 jOOQ 创建类似于 arrayRemove 的函数但这允许一次从 uuid[] 类型的 PostgreSQL 列中删除多个元素。

所以我的第一次尝试是:

private Field<UUID[]> arrayRemoveAll(final Field<UUID[]> field, final Set<UUID> elements) {
return select(field("array_agg(tab.col)", UUID[].class))
.from(unnest(field).as("tab", "col"))
.where(field("tab.col", UUID.class).notIn(elements))
.asField();
}

成功删除了每个请求的元素,但如果我尝试删除每个元素,则会返回 null 而不是空数组。

所以我在我的代码中添加了一个合并,使其返回一个空数组:

private Field<UUID[]> arrayRemoveAll(final Field<UUID[]> field, final Set<UUID> elements) {
final Field<UUID[]> newArray = select(field("array_agg(tab.col)", UUID[].class))
.from(unnest(field).as("tab", "col"))
.where(field("tab.col", UUID.class).notIn(elements))
.asField();
return coalesce(newArray, field("{}", UUID[].class));
}

但是运行这段代码抛出了这个异常:

org.jooq.exception.DataAccessException: SQL [<<confidential SQL removed>>]
Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"

这是它所提示的 SQL 异常的一部分(注意 coalesce 中尾随的逗号和缺少的第二个参数):

coalesce((select array_agg(tab.col)
from unnest("my_schema"."my_table"."my_field") as "tab"("col")
where tab.col not in (?, ?)), )

这是 jOOQ 中的错误吗?

最佳答案

我发现我在上面的代码中混合了fieldval,改变了field("{}", UUID[].class) val(new UUID[0]) 解决了这个问题。

另请查看 Lukas Eder 关于如何使用 field 解决问题的回答。

所以最终的代码,带有泛型,看起来像这样:

private <T> Field<T[]> arrayRemoveAll(final Field<T[]> field, final Set<T> elements, final T[] emptyArray) {
final Field<T[]> newArray = select(field("array_agg(tab.col)"))
.from(unnest(field).as("tab", "col"))
.where(field("tab.col").notIn(elements))
.asField();
return coalesce(newArray, val(emptyArray));
}

您可以像这样在语句中使用它:

using(configuration)
.update(MY_TABLE)
.set(MY_TABLE.MY_COLUMN,
arrayRemoveAll(MY_TABLE.MY_COLUMN, someElements, new UUID[0]))
.where(MY_TABLE.ID.eq(...))
.execute();

关于postgresql - 使用 jOOQ 从 Postgres 数组中删除几个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50160126/

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