Подтвердить что ты не робот

JOOQ и автогенерация, как избежать записей UDT внутри таблицы POJO

Я определяю тип T и представление V в базе данных PostgreSQL.

CREATE TYPE my_type AS
(
  mt_column1 smallint NOT NULL
);

CREATE VIEW my_view
AS SELECT
   some_column_id integer
   ARRAY(SELECT
      ROW(an_int)::my_type
      FROM a_table
   ) AS my_view_types
  FROM a_regular_table 
  WHERE my_condition_hold);

Используя генерацию кода в версии 3.7, я получаю как класс записи UDT MyTypeRecord, так и класс записи таблицы MyViewRecord и класс POJO UDT MyType и таблицу POJO class MyView.

Сгенерированный класс MyView имеет массив MyTypeRecord.

public class MyView extends Object implements Serializable, Cloneable, IMyView {

    private static final long serialVersionUID = 1984808170;

    private final Long           some_column_id;
    private final MyTypeRecord[] my_view_types;
}

в то время как в POJO я ожидал бы массив POJO, например:

    private final MyType[] my_view_types;

Еще один интересный факт: pojo и запись для типа находятся в папке udt, а для представления они находятся в папке tables: возможно, это поможет найти решение/объяснение.

Есть ли способ сделать View преобразование только для pojo во время генерации?


По запросу я приложил рабочий пример, который генерирует записи и POJO, как я описал. Он используется совместно с FileDropper в этой ссылке.


Я также сообщаю об одном возможном трюке, чтобы избежать этой проблемы, чтобы быть использованным, если вы действительно в отчаянии. Как сообщалось qaru.site/info/264978/..., jOOQ, даже если мы назначим POJO вместо записи, не сможет автоматически преобразовывать массив записей в класс записи MyTypeRecord. Следовательно, вы можете проанализировать массив ROW на json, используя функцию array_to_json. В моем примере:

CREATE VIEW my_view
AS SELECT
   some_column_id integer
   array_to_json(ARRAY(SELECT        
        ROW(an_int)::my_type         
      FROM a_table
   ))::json AS my_view_types
  FROM a_regular_table 
  WHERE my_condition_hold);

Это должно быть автоматически преобразовано jOOQ в JSON, если вы зарегистрируете эту привязку.

4b9b3361

Ответ 1

Это ошибка в генераторе кода jOOQ:
https://github.com/jOOQ/jOOQ/issues/5103

Он появляется только в PostgreSQL при генерации POJO для таблиц с массивными типами массивов. В настоящее время я не вижу обходного пути.

Ответ 2

Причина, по которой он делает то, что он делает, состоит в том, что у View нет связанного с ним PrimaryKey, по крайней мере, не с большинством баз данных, я не могу представить ни одного, который сообщал бы PrimaryKey для просмотра.

Вы можете указать первичный ключ для генерации, используя либо <syntheticPrimaryKeys>, либо вы можете использовать <overridePrimaryKeys>, как описано в расширенной конфигурации генератора раздела руководства.

Соответствующие части jooq-meta configuration:

<!-- A regular expression matching all columns that participate in "synthetic" primary keys,
       which should be placed on generated UpdatableRecords, to be used with

        - UpdatableRecord.store()
        - UpdatableRecord.update()
        - UpdatableRecord.delete()
        - UpdatableRecord.refresh()

       Synthetic primary keys will override existing primary keys. -->
  <syntheticPrimaryKeys>SCHEMA\.TABLE\.COLUMN(1|2)</syntheticPrimaryKeys>

<!-- All (UNIQUE) key names that should be used instead of primary keys on
       generated UpdatableRecords, to be used with

        - UpdatableRecord.store()
        - UpdatableRecord.update()
        - UpdatableRecord.delete()
        - UpdatableRecord.refresh()

        If several keys match, a warning is emitted and the first one encountered will be used.

        This flag will also replace synthetic primary keys, if it matches. -->
  <overridePrimaryKeys>MY_UNIQUE_KEY_NAME</overridePrimaryKeys>