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

Java jOOQ和自动生成,如何避免表POJO中的UDT记录,java,postgresql,jooq,Java,Postgresql,Jooq,我在PostgreSQL数据库中定义了类型T和视图V 创建类型my_类型为 mt_column1 smallint不为空 ; 创建视图我的视图 作为选择 某个\u列\u id整数 阵列选择 ROWan_int::我的类型 从桌子上 作为我的视图类型 从一张普通的桌子 我的状况如何; 使用3.7版上的代码生成,我得到了UDT记录类MyTypeRecord和表记录类MyViewRecord以及UDT POJO类MyType和表POJO类MyView MyView生成的类有一个MyTypeRecord

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

创建类型my_类型为 mt_column1 smallint不为空 ; 创建视图我的视图 作为选择 某个\u列\u id整数 阵列选择 ROWan_int::我的类型 从桌子上 作为我的视图类型 从一张普通的桌子 我的状况如何; 使用3.7版上的代码生成,我得到了UDT记录类MyTypeRecord和表记录类MyViewRecord以及UDT POJO类MyType和表POJO类MyView

MyView生成的类有一个MyTypeRecord数组

在POJO中,我希望有一组POJO,例如:

    private final MyType[] my_view_types;
另一个有趣的事实是,pojo和类型的记录位于udt文件夹中,而对于视图,它们位于tables文件夹中:这可能有助于找到解决方案/解释

有没有办法在生成时将视图转换为仅pojo的转换? 根据要求,我附上了一个工作示例,该示例生成了我所描述的记录和POJO。它与链接处的FileDropper共享

我还报告了一个可能的技巧来避免这个问题,当你真的绝望的时候可以使用。如前所述,即使我们分配了POJO而不是记录,jOOQ也无法自动将记录数组转换为记录类MyTypeRecord。因此,可以使用函数array_to_json将行数组解析为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。

它之所以这样做是因为视图没有与之关联的PrimaryKey,至少与大多数数据库没有关联,我想不出有哪一个视图会报告视图的PrimaryKey

可以使用指定要生成的主键,也可以按照手册一节中的说明使用

相关部分:
这是jOOQ代码生成器中的一个错误:


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

在我的例子中会是怎样的?你的例子是一个不完整的稻草人,在这一点上,你需要发布一个更具体的例子,但是文档非常清楚如何定义您希望视图上的主键。请尝试一下,然后返回一个特定的问题,说明为什么我的答案不起作用。我做了一次尝试。除了我现在在视图的POJO上有@Id注释外,我没有看到关于我的问题的任何更改。我添加了一个指向tar.gz文件的链接,该文件包含一个带有模式的示例和相应的自动生成的类,我现在从类中看到UDT POJO是在表POJO之后生成的。也许这就是为什么不把它们放在桌上的原因。嘿,卢卡斯,谢谢你的提示。现在,我将所有内容映射到json中。需要一些额外的映射,但工作正常,我会在性能上有所损失。一句话中的注释虽然当前生成的代码在PostgreSQL中仍然有效,但用户不希望在生成的POJO中有任何jOOQ记录依赖项。。使用DSLContext从DB到POJO的映射也不起作用,因为无法将行转换为@JeanValjean:Hmm中的记录相同的问题,这个问题应该得到解决。你确定它仍然盛行吗?你可以举一个例子来重现它吗?例如,作为一个关于堆栈溢出的新问题,或者是一个关于堆栈溢出的新问题。是的,我从前面链接的评论中假设了同样的问题。我将更新我附加到此问题的示例,并将stacktrace发布到您报告的用户组
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);
<!-- 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>