我有一个案例,我们有这样的继承策略(这是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
答案 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.members
为Lazy
已加载。休眠不执行N + 1
选择,而是从缓存中获取。