将规范化的 Postgres 视图映射到实体 |弹簧靴

Posted

技术标签:

【中文标题】将规范化的 Postgres 视图映射到实体 |弹簧靴【英文标题】:Map a Normalized Postgres View to Entity | SringBoot 【发布时间】:2021-09-24 02:57:25 【问题描述】:

我有多个具有一对多关系的表。例如:

Document
- id
- filename
- status

Field ( relation b/w document & field is 1 to many )
- id
- type
- fk_document_id -> Document::id

FieldValue ( relation b/w field & field_value is 1 to many )
- id
- value
- fk_field_id -> Field::id

Coordinates ( relation b/w field_value & coordinate is 1 to many )
- id
- start_x
- start_y
- end_x
- end_y
- fk_field_value_id -> FieldValue::id

因为我无法直接从我的项目中访问这些表,所以我创建了一个视图

CREATE VIEW AS
 SELECT * FROM document doc
   LEFT JOIN field ON doc.id=field.document_id
   LEFT JOIN field_value ON field.id=field_value.field_id
   LEFT JOIN coordinate ON field_value.id=coordinate.id;

一个文档的视图结果集如下所示:

document_id | filename  | field_id  | type   | field_value_id   | value  | coordinate_id | start_x   | start_y ...
id_1        | test.pdf  | f_id_1    | single | f_v_id_1         | test1  | c_id_1        | 0         | 1
id_1        | test.pdf  | f_id_1    | single | f_v_id_1         | test1  | c_id_2        | 1         | 3
id_1        | test.pdf  | f_id_1    | single | f_v_id_2         | test2  | c_id_3        | 2         | 4
id_1        | test.pdf  | f_id_1    | single | f_v_id_2         | test2  | c_id_4        | 0         | 5

我在 Java 中定义了如下所示的实体:

class Document 
    String id;
    String filename;
    List<Field> fields;


class Field 
    String id;
    Sring type;
    List<FieldValue> values;


class FieldValue 
    String id;
    String value;
    List<Cordinate> coordinates;


class Coordinate 
    String id;
    int start_x;
    int start_y;
    int end_x;
    int end_y;

那么我如何将结果从视图映射到文档实体?

注意:我无法创建多个视图,因为在实际场景中我有很多表。

【问题讨论】:

【参考方案1】:

这是不可能的,您无法将在视图中展平的一对多关联映射为实体。 Hibernate 无法以这种方式正确管理行。不过,您不需要视图。 Hibernate 完全有能力创建一个查询,就像您用于按需查看的查询一样。

【讨论】:

嗨 Chistian,实际上用例是这样的,我不能直接访问表,我只能访问视图,甚至存储过程都可以工作。 这很好,但是如何为每个表创建一个视图并将每个视图映射到它自己的实体?如果这对您不起作用,则必须将视图映射到平面实体。但是,如果您想在此模型之上使用集合创建更丰富的投影,则可以使用 Blaze-Persistence。

以上是关于将规范化的 Postgres 视图映射到实体 |弹簧靴的主要内容,如果未能解决你的问题,请参考以下文章

用于将自定义查询映射到具有用户定义的键/值对的分层实体的“规范”方法

休眠位数组到实体映射

更新映射到视图的实体框架实体

将 MySql 视图映射到 JPA 实体,使用哪个唯一 ID?

将两个字段映射到一个数据库列

将viewModel对象映射到ICollection实体