首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义例程中的Jooq extra-quoting函数参数

自定义例程中的Jooq extra-quoting函数参数
EN

Stack Overflow用户
提问于 2018-03-16 01:03:24
回答 1查看 141关注 0票数 2

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

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

代码语言:javascript
复制
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的等价物应该是这样的:

代码语言:javascript
复制
Field<Array<T>> concatenate(Field<Array<T>> a, Array<T> b, Class<T[]> type) {
    return DSL.field("{0} || {1}", type, a, b);
}

现在,我正在尝试用jooq编写这个查询:

代码语言:javascript
复制
UPDATE users
    SET groups = array_distinct(
        array_remove_all(groups, ARRAY['a', 'b']) || ARRAY['c']
    );

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

然而,当我这样做的时候:

代码语言:javascript
复制
    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;在内部,它只不过是一个类型转换。

通过生成的查询是:

代码语言:javascript
复制
update "public"."users"
    set "public"."users"."groups" = "public"."array_distinct"('"public"."array_remove_all"(
        ''"public"."users"."groups"'', 
        ARRAY[''a'', ''b'']
    ) || ARRAY[''c'']'
)

整件事到处都是额外的引号(')。要生成上面提到的查询,我需要做些什么?

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

EN

回答 1

Stack Overflow用户

发布于 2018-03-19 18:53:12

jOOQ代码生成器目前(从3.10版到即将发布的3.11版)不支持PostgreSQL中的anyarray类型。挂起的特性请求在这里:https://github.com/jOOQ/jOOQ/issues/5479

您将需要应用以下任意一种解决方法:

对于array_remove_all函数,

函数,

  • 使用自定义数据类型绑定。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49305271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档