jOOQ et l'autogénération, Comment éviter les enregistrements UDT à L'intérieur de la table POJOs

je définis un type T et une vue V dans une base de données 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);

utilisant la génération de code sur version 3.7 j'obtiens à la fois une classe d'enregistrement UDT MyTypeRecord et une classe d'enregistrement de table MyViewRecord et la classe de POJO UDT MyType et la classe de POJO de table MyView .

la classe générée par MyView a un tableau 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;
}

alors que dans un POJO Je m'attendrais à un tableau de POJOs, par exemple:

    private final MyType[] my_view_types;

un autre fait intéressant est que le pojo et l'enregistrement pour le type sont dans le dossier udt , alors que pour la vue ils sont dans le dossier tables : peut-être cela peut aider à trouver une solution/explication.

y a-t-il un moyen de faire du View une conversion uniquement pojo au moment de la génération?


Sur demande, j'ai joint un exemple de travail qui génère les notices et les POJOs comme je l'ai décrit. Il est partagé avec FileDropper à ce lien .


je rapporte aussi une astuce possible pour éviter ce problème, à utiliser iff vous êtes vraiment désespéré. Comme indiqué dans cette question/réponse de stackoverflow , jOOQ même si nous assignons un POJO à la place de l'enregistrement, ne sera pas en mesure de convertir automatiquement le tableau d'enregistrements dans la classe d'enregistrement MyTypeRecord . Par conséquent, vous pouvez analyser le tableau de ROW s à json en utilisant la fonction array_to_json . Dans mon exemple serait:

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);

ceci doit être converti automatiquement par jOOQ à un JSON si vous enregistrez ce liant.

20
demandé sur Community 2016-02-15 10:44:49

2 réponses

c'est un bug dans le générateur de code jOOQ:

https://github.com/jOOQ/jOOQ/issues/5103

il apparaît seulement dans PostgreSQL, lors de la génération de POJOs pour les tables avec des tableaux de type composite. Actuellement, je ne vois pas une solution de contournement.

2
répondu Lukas Eder 2016-02-22 14:27:38

la raison pour laquelle il fait ce qu'il fait est parce qu'un View n'a pas un PrimaryKey associé à elle, au moins pas avec la plupart des bases de données, Je ne peux pas penser à un seul qui rapporterait un PrimaryKey pour une vue.

vous pouvez spécifier la clé primaire de la génération en utilisant <syntheticPrimaryKeys> ou vous pouvez utiliser <overridePrimaryKeys> comme décrit dans la section advanced generator configuration du manuel.

parties pertinentes de 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>
2
répondu feeling abused and harassed 2016-02-18 18:17:46