jOOQ和自动生成,如何避免表POJO中的UDT记录

2022-09-02 10:58:18

我在PostgreSQL数据库中定义了一个类型和一个视图。TV

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记录类和一个表记录类以及UDT POJO类和表POJO类。MyTypeRecordMyViewRecordMyTypeMyView

生成的类具有一个数组 。MyViewMyTypeRecord

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和类型的记录在文件夹中,而对于视图,它们在文件夹中:也许这可以帮助找到解决方案/解释。udttables

有没有办法在世代时进行仅pojo转换?View


根据要求,我附上了一个工作示例,该示例生成我所描述的记录和POJO。它在此链接中与FileDropper共享。


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


答案 1

这是 jOOQ 代码生成器中的一个错误:
https://github.com/jOOQ/jOOQ/issues/5103

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


答案 2

它正在做它正在做的事情的原因是因为a没有与它相关联,至少与大多数数据库没有关联,我想不出一个可以报告视图的数据库。ViewPrimaryKeyPrimaryKey

您可以使用 指定生成的主键,也可以按照手册的高级生成器配置部分所述使用。<syntheticPrimaryKeys><overridePrimaryKeys>

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>

推荐