我在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。它与this链接上的FileDropper共享。
我还报告了一个可能的伎俩,以避免这个问题,如果你真的很绝望,就要使用它。正如报告in this stackoverflow question/answer,即使我们分配POJO而不是记录,jOOQ也无法自动将记录数组转换为记录类MyTypeRecord
。因此,您可以使用函数ROW
将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);
如果您注册this绑定,这应该由jOOQ自动转换为JSON。
答案 0 :(得分:2)
它正在做它正在做的事情的原因是因为View
没有与PrimaryKey
相关联,至少没有大多数数据库,我想不出一个单一的会为视图报告PrimaryKey
。
您可以使用<syntheticPrimaryKeys>
指定生成的主键,也可以使用本手册advanced generator configuration部分中所述的<overridePrimaryKeys>
。
<!-- 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>
答案 1 :(得分:2)
这是jOOQ代码生成器中的错误:
https://github.com/jOOQ/jOOQ/issues/5103
当为具有复合类型数组的表生成POJO时,它仅出现在PostgreSQL中。我目前没有看到解决方法。