java postgresql jooq

java - jOOQ y autogeneración, cómo evitar los registros UDT dentro de los POJO de la tabla



jooq spring boot (2)

Este es un error en el generador de código jOOQ:
https://github.com/jOOQ/jOOQ/issues/5103

Aparece solo en PostgreSQL, al generar POJO para tablas con arreglos de tipo compuesto. Actualmente no veo una solución.

Defino un tipo T y una vista V en una base de datos 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);

Al usar la generación de código en la versión 3.7 , obtengo una clase de registro UDT MyTypeRecord y una clase de registro de tabla MyViewRecord y la clase UDT POJO MyType y la tabla POJO clase MyView .

La clase generada MyView tiene una matriz de 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; }

mientras esté en un POJO, esperaría una serie de POJO, por ejemplo:

private final MyType[] my_view_types;

Otro hecho interesante es que el pojo y el registro para el tipo están en la carpeta udt , mientras que para la vista están en la carpeta de tables : tal vez esto pueda ayudar a encontrar una solución / explicación.

¿Hay alguna manera de hacer que View una conversión solo en pojo en el momento de la generación?

A pedido, adjunté un ejemplo de trabajo que genera los registros y los POJO como describí. Se comparte con FileDropper en this enlace.

También informo un posible truco para evitar este problema, que se utilizará si está realmente desesperado. Como se informa en esta pregunta / respuesta de stackoverflow , jOOQ incluso si asignamos un POJO en lugar del registro, no podrá convertir automáticamente la matriz de registros en la clase de registro MyTypeRecord . Por lo tanto, puede analizar la matriz de ROW s a json utilizando la función array_to_json . En mi ejemplo sería:

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 debe convertirlo automáticamente a un JSON si registra this enlace.


La razón por la que está haciendo lo que está haciendo es porque una View no tiene una PrimaryKey asociada a ella, al menos no con la mayoría de las bases de datos, no puedo pensar en una única que informaría una PrimaryKey para una vista.

Puede especificar la clave principal para generar usando las <syntheticPrimaryKeys> o puede usar <overridePrimaryKeys> como se describe en la sección de configuración avanzada del generador del manual.

Partes relevantes de la configuración de jooq-meta :

<!-- 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>