2016-03-22 3 views
1

PostGreSQL 9.4.5 jOOQ 3.7.2 говор установлен POSTGRES_9_4агрегатных jOOQ функции в PostgreSQL

Я пытаюсь использовать 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?

ответ

2

Это ошибка в jOOQ (#5158) и будет исправлена ​​в следующих выпусках.

Есть два пути, что я могу думать:

  • Один вы предложили себя: с помощью простого SQL повторно реализовать функциональные возможности правильно.
  • подражая FILTER с CASE:

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

    См PostgresDSL.arrayRemove()

Смежные вопросы