使用基于非实体对象的连接

Using join based on a non-entity object

我有以下结构:

Table1
  T1_ID
  T1_Col1

Table2
  T1_ID
  T3_ID

Table3
  T3_ID
  T3_Col1

我有 Table1Table3 的实体对象。但是,我没有 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 查询而不是主键获取关联 Table3Table1 的解决方法是使用 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。您会发现几个有用的场景以及如何映射到实体模型。