【发布时间】:2018-10-14 01:37:30
【问题描述】:
我正在尝试使用 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 中的错误吗?
【问题讨论】:
标签: postgresql jooq