【问题标题】:jOOQ aggregation functions in postgresqlpostgresql 中的 jOOQ 聚合函数
【发布时间】:2016-03-23 19:37:18
【问题描述】:

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 中生成这个聚合函数的正确方法是什么?

【问题讨论】:

    标签: java jooq postgresql-9.4


    【解决方案1】:

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

    我能想到两种解决方法:

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

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

      PostgresDSL.arrayRemove()

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多