【问题标题】:Jooq extra-quoting function parameters in a custom routine自定义例程中的 Jooq 额外引用函数参数
【发布时间】: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&lt;Array&lt;T&gt;&gt; 上的扩展函数;在内部,它只不过是一个类型转换。

生成的查询是:

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

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

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

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 2014-07-10
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      相关资源
      最近更新 更多