Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 子类的JPA获取集合_Java_Hibernate_Jpa_Inheritance_Jpql - Fatal编程技术网

Java 子类的JPA获取集合

Java 子类的JPA获取集合,java,hibernate,jpa,inheritance,jpql,Java,Hibernate,Jpa,Inheritance,Jpql,我有一个案例,我们有这样一个继承策略(这是jpa wiki的一个示例,我们的真实示例是另一个业务案例:) @实体 @继承权 @鉴别器列(name=“项目类型”) @表(name=“项目”) 公共抽象类项目{ @身份证 私人长id; ... } @实体 @鉴别器值(“L”) 公共类大型项目扩展项目{ @独身癖 私有集合成员; } @实体 @鉴别器值(“S”) 公共类SmallProject扩展项目{ } 我的数据库中有一堆项目,希望一次获取所有项目,但通过这样做,我还希望一次获取我的成员列表。

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

@实体
@继承权
@鉴别器列(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)