我在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())为了在Field<Array<T>>上使用concatenate作为扩展函数,我需要使用asTypedField;在内部,它只不过是一个类型转换。
通过生成的查询是:
update "public"."users"
set "public"."users"."groups" = "public"."array_distinct"('"public"."array_remove_all"(
''"public"."users"."groups"'',
ARRAY[''a'', ''b'']
) || ARRAY[''c'']'
)整件事到处都是额外的引号(')。要生成上面提到的查询,我需要做些什么?
即使是串联中的最后一个数组,它的所有元素在任何地方(''a'',''b'')都使用了两次引号'。
发布于 2018-03-19 18:53:12
jOOQ代码生成器目前(从3.10版到即将发布的3.11版)不支持PostgreSQL中的anyarray类型。挂起的特性请求在这里:https://github.com/jOOQ/jOOQ/issues/5479
您将需要应用以下任意一种解决方法:
对于array_remove_all函数,
||操作符使用了普通的SQL模板,因此这可能是这里的首选方法。特别是,如果您希望使两个数组类型具有相同类型的泛型类型安全。对于https://www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-bindings函数,
https://stackoverflow.com/questions/49305271
复制相似问题