【发布时间】:2018-08-24 14:34:50
【问题描述】:
我在 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'')。
【问题讨论】: