jOOQ和autogeneration,如何避免表POJO中的UDT记录

我在PostgreSQL数据库中定义了类型T和视图V

 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以及UDT POJO类MyType和表POJO类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共享。


我还报告了一个可能的伎俩,以避免这个问题,如果你真的很绝望,就要使用它。 正如在这个stackoverflow问题/答案中所报告的那样 ,即使我们分配了一个POJO而不是记录,jOOQ也无法自动将记录数组转换为记录类MyTypeRecord 。 因此,您可以使用函数array_to_jsonROW的数组解析为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

当为具有复合类型数组的表生成POJO时,它仅出现在PostgreSQL中。 我目前没有看到解决方法。

它正在做它正在做的事情的原因是因为View没有与之关联的PrimaryKey ,至少不是大多数数据库,我想不出一个会报告一个PrimaryKey的视图。

您可以使用指定生成的主键,也可以使用 ,如本手册的高级生成器配置部分所述。

jooq-meta配置的相关部分:

  SCHEMA\.TABLE\.COLUMN(1|2)  MY_UNIQUE_KEY_NAME