使用基于非实体对象的连接
Using join based on a non-entity object
我有以下结构:
Table1
T1_ID
T1_Col1
Table2
T1_ID
T3_ID
Table3
T3_ID
T3_Col1
我有 Table1
和 Table3
的实体对象。但是,我没有 Table2
的实体对象。我不想创建它,因为我将不得不走更长的路来为实体等创建复合键。
我想使用的是这样的查询:
select t3 from Table1 t1, Table2 t2, Table3 t3
where t1.t1_id=:id
and t2.t1_id=t1.t1_id
and t2.t3_id=t3.t3_id
实际问题
我有一个 Table1
的存储库,其中 Table3
配置为 lazyloading
。但是,当我通过 primarykey
获取 Table1
后尝试访问时,出现异常 org.hibernate.LazyInitializationException
.
经过一番研究后,我发现那里没有可用的会话。我尝试了几个解决方法,但 none 奏效了。鉴于持久性框架是由另一个团队编写的,我没有太多知识可以看看它是否可以完成。所以我正在寻找这个解决方案,它可能更容易。
通过 JPQL 查询而不是主键获取关联 Table3
和 Table1
的解决方法是使用 FETCH JOIN。在某种程度上,它覆盖了延迟加载配置。
然后,获取您想要实现的目标的查询将类似于:
select t1 from Table1 t1 left join fetch t1.table3 where t1.id = :id
编辑:根据你的描述,我想你有一些类似于下一个的实体模型。
@Entity
class Table1 {
@Id
@Column(name="T1_ID")
long id;
@OneToOne// also works with @ManyToMany
@JoinTable(name="Table2",
joinColumns={@JoinColumn(name="T1_ID")},
inverseJoinColumns={@JoinColumn(name="T3_ID")}
Table3 table3;
...
}
@Entity
class Table3 {
@Id
@Column(name="T3_ID")
long id;
...
}
另外,看看this site。您会发现几个有用的场景以及如何映射到实体模型。
我有以下结构:
Table1
T1_ID
T1_Col1
Table2
T1_ID
T3_ID
Table3
T3_ID
T3_Col1
我有 Table1
和 Table3
的实体对象。但是,我没有 Table2
的实体对象。我不想创建它,因为我将不得不走更长的路来为实体等创建复合键。
我想使用的是这样的查询:
select t3 from Table1 t1, Table2 t2, Table3 t3
where t1.t1_id=:id
and t2.t1_id=t1.t1_id
and t2.t3_id=t3.t3_id
实际问题
我有一个 Table1
的存储库,其中 Table3
配置为 lazyloading
。但是,当我通过 primarykey
获取 Table1
后尝试访问时,出现异常 org.hibernate.LazyInitializationException
.
经过一番研究后,我发现那里没有可用的会话。我尝试了几个解决方法,但 none 奏效了。鉴于持久性框架是由另一个团队编写的,我没有太多知识可以看看它是否可以完成。所以我正在寻找这个解决方案,它可能更容易。
通过 JPQL 查询而不是主键获取关联 Table3
和 Table1
的解决方法是使用 FETCH JOIN。在某种程度上,它覆盖了延迟加载配置。
然后,获取您想要实现的目标的查询将类似于:
select t1 from Table1 t1 left join fetch t1.table3 where t1.id = :id
编辑:根据你的描述,我想你有一些类似于下一个的实体模型。
@Entity
class Table1 {
@Id
@Column(name="T1_ID")
long id;
@OneToOne// also works with @ManyToMany
@JoinTable(name="Table2",
joinColumns={@JoinColumn(name="T1_ID")},
inverseJoinColumns={@JoinColumn(name="T3_ID")}
Table3 table3;
...
}
@Entity
class Table3 {
@Id
@Column(name="T3_ID")
long id;
...
}
另外,看看this site。您会发现几个有用的场景以及如何映射到实体模型。