具有一对多关系的休眠地图视图

hibernate map view with one to many relations

我正在使用休眠 @Subselect 注释将 sql 视图映射到实体 class。 基本上,它看起来有点像这样:

@Subselect(
    "SELECT table1.*, table2.id as tid FROM " 
   + "table1 INNER JOIN table2 on table2.field = table1.field"
)
@Entity
@Immutable
class Entity {
    // fields
}

当加入工作时,我可能会得到类似下面的东西

========================================
| table1.id | table1.field | table2.id |
========================================
|         1 |            1 |         1 |
========================================
|         1 |            1 |         2 |
========================================

因此表 2 中的几条记录可以连接到表 1 中的一行。这很好,但是在 java 实体中我想将其映射为一对多关系(一个实体到多个 table2 实体),这是我写的,它适用于其他类型的关系:

@Subselect(
    "SELECT table1.*, table2.id as tid FROM " 
   + "table1 INNER JOIN table2 on table2.field = table1.field"
)
@Entity
@Immutable
class Entity {
    @OneToMany
    @JoinColumn(name = "tid", updatable = false, insertable = false)
    private Set<Table2Entity> elements = new HashSet<>();
}

但是,实体中的集合总是空的,这是为什么呢? 上述方法适用于一对一和多对一关系。

反过来,不需要与 sql 连接来为视图实体带来一对多关系。我是这样解决的:

Subselect(
    "SELECT * from table1" 
)
@Entity
@Immutable
class Entity {
    @OneToMany
    @JoinColumn(name = "field", updatable = false, insertable = false)
    private Set<Table2Entity> elements = new HashSet<>();
}

我只需要输入列名,需要连接的表就可以了。