将规范化的 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 视图映射到实体 |弹簧靴的主要内容,如果未能解决你的问题,请参考以下文章
用于将自定义查询映射到具有用户定义的键/值对的分层实体的“规范”方法