Ответ 1
Это ошибка в генераторе кода jOOQ:
https://github.com/jOOQ/jOOQ/issues/5103
Он появляется только в PostgreSQL при генерации 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, если вы зарегистрируете эту привязку.
Это ошибка в генераторе кода jOOQ:
https://github.com/jOOQ/jOOQ/issues/5103
Он появляется только в PostgreSQL при генерации POJO для таблиц с массивными типами массивов. В настоящее время я не вижу обходного пути.
Причина, по которой он делает то, что он делает, состоит в том, что у View
нет связанного с ним PrimaryKey
, по крайней мере, не с большинством баз данных, я не могу представить ни одного, который сообщал бы PrimaryKey
для просмотра.
Вы можете указать первичный ключ для генерации, используя либо <syntheticPrimaryKeys>
, либо вы можете использовать <overridePrimaryKeys>
, как описано в расширенной конфигурации генератора раздела руководства.
<!-- 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>