Jooq 在自定义例程中额外引用函数参数



我在postgresql中定义了两个例程,分别是array_distinct(anyarray)array_remove_all(anyarray, anyarray)。这确实在 jooq 的Routines类中正确生成。

除此之外,我还有一些函数可以用来生成一些 PostgreSQL 数组运算符:

inline fun <reified T> Field<Array<T>>.concatenate(other: Array<T>) : Field<Array<T>> {
return DSL.field("{0} || {1}", Array<T>::class.java, this, other)
}

这是在 Kotlin 中,所以 java 等价物是这样的:

Field<Array<T>> concatenate(Field<Array<T>> a, Array<T> b, Class<T[]> type) {
return DSL.field("{0} || {1}", type, a, b);
}

现在我正在尝试用 jooq 编写此查询:

UPDATE users
SET groups = array_distinct(
array_remove_all(groups, ARRAY['a', 'b']) || ARRAY['c']
);

为了简洁起见,我删除了使此代码有效所需的几个类型转换。

但是,当我这样做时:

DSL.update(USERS)
.set(USERS.GROUPS, Routines.arrayDistinct(
Routines.arrayRemoveAll(
USERS.GROUPS,
arrayOf("a", "b")
)
.asTypedField<Array<String>>()
.concatenate(arrayOf("c"))
).asTypedField())

asTypedField是我需要做的事情,这样我就可以使用concatenate作为Field<Array<T>>上的扩展函数;在内部它只不过是一个类型转换。

生成的查询是:

update "public"."users"
set "public"."users"."groups" = "public"."array_distinct"('"public"."array_remove_all"(
''"public"."users"."groups"'', 
ARRAY[''a'', ''b'']
) || ARRAY[''c'']'
)

这整个事情到处都是额外的引号(')标记。我需要做什么来生成我上面提到的查询?

即使是连接中的最后一个数组,其所有元素在任何地方都使用引号'两次(''a''''b'')。

jOOQ 代码生成器目前(从版本 3.10 和即将发布的 3.11 开始)不支持 PostgreSQL 中的anyarray类型。待处理的功能在此处请求他: https://github.com/jOOQ/jOOQ/issues/5479

您将需要应用以下任何解决方法:

  • array_remove_all函数也使用普通 SQL 模板。您已经在为||运算符使用普通 SQL 模板,因此这可能是这里的首选方法。特别是,如果您希望使两个数组类型属于同一类型的泛型类型安全性。
  • array_remove_all函数使用自定义数据类型绑定:https://www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-bindings

最新更新