Java 子类的JPA获取集合
我有一个案例,我们有这样一个继承策略(这是jpa wiki的一个示例,我们的真实示例是另一个业务案例:)Java 子类的JPA获取集合,java,hibernate,jpa,inheritance,jpql,Java,Hibernate,Jpa,Inheritance,Jpql,我有一个案例,我们有这样一个继承策略(这是jpa wiki的一个示例,我们的真实示例是另一个业务案例:) @实体 @继承权 @鉴别器列(name=“项目类型”) @表(name=“项目”) 公共抽象类项目{ @身份证 私人长id; ... } @实体 @鉴别器值(“L”) 公共类大型项目扩展项目{ @独身癖 私有集合成员; } @实体 @鉴别器值(“S”) 公共类SmallProject扩展项目{ } 我的数据库中有一堆项目,希望一次获取所有项目,但通过这样做,我还希望一次获取我的成员列表。
@实体
@继承权
@鉴别器列(name=“项目类型”)
@表(name=“项目”)
公共抽象类项目{
@身份证
私人长id;
...
}
@实体
@鉴别器值(“L”)
公共类大型项目扩展项目{
@独身癖
私有集合成员;
}
@实体
@鉴别器值(“S”)
公共类SmallProject扩展项目{
}
我的数据库中有一堆项目,希望一次获取所有项目,但通过这样做,我还希望一次获取我的成员列表。
有没有一种方法可以用jpql实现这一点?我知道类型注释允许我查看类型,但是我可以将其与连接获取结合起来吗
我正在使用hibernate,但如果我不需要稍微晚一点,我不想降级回hibernate api,但我只使用JPQL发现了一个问题。 就你而言:
SELECT p FROM Project p JOIN FETCH ((TREAT(p as LargeProject)).members)
JPA和Hibernate不支持从子类获取关联,除非该属性也存在于层次结构的最顶层成员中。但是根据本文()的说法,您可以通过利用hibernate的1级缓存机制来克服这个限制
在这种情况下,您将首先在一个单独的查询中获取
成员的所有实例,然后对项目执行查询,让大型项目.members
加载惰性。hibernate不会执行N+1
选择,而是从缓存中获取这些信息。当您执行entityManager.createQuery(“from”+Project.class.getName())时,现在会发生什么?它不会获取成员列表吗?是的,但它不会让我决定是否要获取成员列表it@jelle你想让他们渴望,这会让他们渴望。问题是,您希望通过一个执行的SQL查询立即对它们进行查询。不依赖HibernateAPI是不可能的,因为JPA规范并不强制实现如何执行SQL查询。我已经怀疑只有JPA是不够的。hibernate解决方案是什么?
SELECT p FROM Project p JOIN FETCH ((TREAT(p as LargeProject)).members)