JPA获取子类的集合

时间:2014-12-09 19:34:03

标签: java hibernate jpa inheritance jpql

我有一个案例,我们有这样的继承策略(这是jpa wiki的一个例子,我们的真实例子是另一个商业案例:))

@Entity
@Inheritance
@DiscriminatorColumn(name="PROJ_TYPE")
@Table(name="PROJECT")
public abstract class Project {
  @Id
  private long id;
  ...
}
@Entity
@DiscriminatorValue("L")
public class LargeProject extends Project {
  @OneToMany
  private Set<Member> members;
}
@Entity
@DiscriminatorValue("S")
public class SmallProject extends Project {
}

我的数据库中有很多项目,想要一次获取所有项目,但通过这样做,我还想立即获取我的成员列表。 有没有办法用jpql做到这一点?我知道TYPE注释允许我查看类型,但是我可以将它与JOIN FETCH结合使用吗?

我正在使用hibernate,但如果我不需要,则不想降级回hibernate api

2 个答案:

答案 0 :(得分:0)

有点晚了,但是我仅使用JPQL时发现了一个问题。 就您而言:

SELECT p FROM Project p JOIN FETCH ((TREAT(p as LargeProject)).members)

答案 1 :(得分:0)

JPA和Hibernate不支持从子类中获取关联,除非该属性也出现在层次结构的最高成员中。但是根据这篇文章(https://thorben-janssen.com/fetch-association-of-subclass/),您可以利用hibernate的1级缓存机制来解决此限制。

在这种情况下,您将首先在单独的查询中获取Member的所有实例,然后在Project上执行查询,使LargeProject.membersLazy已加载。休眠不执行N + 1选择,而是从缓存中获取。