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

时间:2015-09-23 02:47:32

标签: java hibernate jpa jpql

我有以下结构:

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。但是,当我在Table1抓取primarykey后尝试访问时,我收到异常org.hibernate.LazyInitializationException

在做了一些研究之后,我发现我在那里没有会话。我尝试了几个解决方法但没有工作。鉴于持久性框架是由另一个团队编写的,我不知道是否可以完成。所以我正在寻找这个可能更容易的解决方案。

1 个答案:

答案 0 :(得分:0)

使用FETCH JOIN通过JPQL查询而不是主键来获取关联的Table3Table1的解决方法。在某种程度上,它会覆盖延迟加载配置。

然后,获得你想要达到的目标的查询将是:

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。您将找到几个有用的场景以及如何映射到实体模型。