postgresql 中的 jOOQ 聚合函数

jOOQ aggregation functions in postgresql

PostgreSQL 9.4.5 jOOQ 3.7.2 方言设置为 POSTGRES_9_4

我正在尝试使用 jOOQ 来换行替换这个原生的 postgresql 聚合表达式:

array_agg(row_to_json(foo) order by "foo"."name" asc) filter (where "attribute".name is not null)

jOOQ DSL 看起来应该可以使用以下代码工作:

arrayAgg(rowToJson(FOO)).orderBy(FOO.NAME).filterWhere(FOO.NAME.isNotNull()))

其中 rowToJson 是 postgres 函数的包装器。 SQL 呈现的是这样的:

array_agg(row_to_json(foo) order by "foo"."name" asc)

目前我正在解决这个问题:

public static <T> Field<T[]> arrayAgg(Field<T> field, final SortField<?> sort, final Condition filter) {
    return field("array_agg({0} order by {1}) filter (where {2})", field.getDataType().getArrayDataType(), field, sort, filter);
}

问题是,第一个代码是否有效?如果不是,在 jOOQ 中生成这个聚合函数的正确方法是什么?

这是 jOOQ (#5158) 中的错误,将在下一个版本中修复。

我能想到两种解决方法:

  • 您自己提出的建议:使用普通 SQL 正确地重新实现功能。
  • 通过用 CASE 模拟 FILTER:

    arrayRemove(
        arrayAgg(when(FOO.NAME.isNotNull(), rowToJson(FOO))).orderBy(FOO.NAME))
        , null
    )
    

    PostgresDSL.arrayRemove()