当前位置: 首页 > 知识库问答 >
问题:

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

左丘昊天
2023-03-14

我在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记录类MyTypeRecords和一个表记录类MyViewRecords,以及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文件夹中,而对于视图,它们在文件夹中:也许这有助于找到解决方案/解释。

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

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

共有2个答案

缪远航
2023-03-14

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

您可以使用指定生成的主键

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

田永春
2023-03-14

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

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

 类似资料:
  • 我的项目需要我自己生成DAO和POJO。必须对其进行某些修改。我的SRS说我必须使用jOOQ。我第一次使用它;我知道jOOQ自己生成POJO和DAO,但我找不到禁用它的方法。 我在jOOQ的文档中找不到任何对我有帮助的东西。有人能告诉我如何从DAO和POJO代禁用jOOQ,但仍然提供记录吗。 Maven pom。xml文件如下: 而且构建使用了gradle。我也不知道这会对更改产生什么影响。

  • 问题内容: 我有以下选择查询创建: jOOQ生成以下查询: 查询应为: 后者查询在PostgreSQL中完美地工作。表别名不应用引号引起来。 这是一个错误吗? (请注意,该查询非常愚蠢。我正在使用jOOQ进行评估。) 以下“黑客”作品: 问题答案: 默认情况下,jOOQ会将所有标识符包装在引号中,以便能够正确处理区分大小写的情况。 令人困惑的部分是为什么这么做并不是为了做到而是为了做到。原因是jO

  • 我试图为我的MySql数据库自动生成jOOQ java代码,但它不起作用。我在maven的JSP项目中使用jOOQ。 xml 我正在使用Tomcat在eclipse上运行这个项目。当我想运行Web应用程序时,我会清理项目,然后清理项目 当我运行该项目时,并没有生成数据库的java代码<正如文档中所说,由于我在jOOQ中使用maven,因此我可以自动生成JAVA代码,而无需使用cli。无需创建库。x

  • 我正在使用jooq为我的H2 db表生成pojo 但是生成的代码(如下) 缺少@GeneratedValue注释,这使得无法使用spring data rest repository插入新记录,因为传入的对象总是抱怨没有设置id字段。 我可以做什么配置/工作来让jooq正常工作? 下面是我用来在编译时生成pojo的相关pom文件部分: 变通方法 在添加该功能之前,遇到相同问题的任何人都可以选择替换

  • 试图用Joda DateTimes生成JooQ POJOs,我遇到了一些问题。POJO使用默认的java.sql从生成器中生成。时间戳值,而不是日期时间。 代码如下。 Create Table(此处时间戳字段的名称已更改)希望确保我没有命中构建系统中的某个缓存。此名称仍应与下面的正则表达式匹配。 转换类——基于文档。 Jooq配置XML。基于文档(感谢您捕获我的表达式/表达式错误Luke)! 创建

  • 至少有两个用例: 除非用户提供筛选器参数,否则显示网格数据是没有意义的 返回标记视图时,不应将显示的数据替换为当前数据。(更新中有进一步阐述) 作为Vaadin 14+的新手,我不知道如何实现这一点。每次显示我的时,都会查询的count和fetch回调。调用来自网格的。 我的用于在和之间切换 是一个,用于将的内容从切换到。 用例2是:当返回到时,的状态应该与以前完全相同(这与很好地配合)。 打开-