Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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_Jpa_Entitymanager - Fatal编程技术网

具有指定继承类型的Java/JPA |查询

具有指定继承类型的Java/JPA |查询,java,jpa,entitymanager,Java,Jpa,Entitymanager,我正在一个通用表“Sample”上构建一个查询,我有几个类型继承自这个表“SampleOne”、“SampleTwo”。 我需要一个类似以下的查询: select s from Sample where s.type = :type 其中type将是表的鉴别器值。是否有可能以任何方式(并避免创建特定于实体的查询,每个SampleOne、SampleTwo……等等) 我非常感谢您对本主题的任何意见 亲切问候,, P.以下是: 抽象实体 抽象类 可通过以下方式声明为实体: 用@Entity装饰类。

我正在一个通用表“Sample”上构建一个查询,我有几个类型继承自这个表“SampleOne”、“SampleTwo”。 我需要一个类似以下的查询:

select s from Sample where s.type = :type
其中type将是表的鉴别器值。是否有可能以任何方式(并避免创建特定于实体的查询,每个SampleOne、SampleTwo……等等)

我非常感谢您对本主题的任何意见

亲切问候,, P.

以下是:

抽象实体

抽象类 可通过以下方式声明为实体: 用
@Entity
装饰类。 抽象实体就像混凝土 实体,但无法实例化

抽象实体可以直接查询 就像具体的实体。如果是摘要 实体是查询的目标 查询对所有的具体对象进行操作 抽象实体的子类:

如果我读对了,你的问题是:

select s from Sample where s.type = :type

如果
type
是鉴别器列,则只应返回指定子类型的元素,因此您唯一要做的就是将结果列表强制转换为所请求的子类型。

在JPA 2.0中,您可以使用
type
表达式(尽管目前它在Hibernate中不适用于参数,请参阅):

类似的Hibernate特定表达式是
.class

select s from Sample s where s.class = :type

在Hibernate 4.3.7中您仍然需要小心,因为
TYPE()
的实现仍然存在问题,例如:

from SpoForeignPilot sfp where TYPE(sfp.partDocument) = :type
此查询不起作用,因为它错误地检查了
SpoForeignPilot
的类型,而不是文档的类型

您可以通过执行以下操作来解决此问题:

select sfp from SpoForeignPilot sfp join sfp.partDocument doc where TYPE(doc) = :type

在您的存储库中执行此操作

@Query("SELECT p FROM BaseUserEntity p where p.class=:discriminatorValue")
    public List<BaseUserEntity> findByDiscriminatorValue(@Param("discriminatorValue") String discriminatorValue);
@Query(“从BaseUserEntity p中选择p,其中p.class=:discriminatorValue”)
公共列表FindBydDiscriminatorValue(@Param(“discriminatorValue”)字符串discriminatorValue);

其中,
BaseUserEntity
是您的父实体吗?

很抱歉,开始了关于类似主题的新讨论,但如果我提供一个抽象类作为:type,它是否有效?根据这一点,Hibernate 4.0.0.CR5中已修复了一些缺失的信息:“type”是一个“JPQL特殊运算符”,接受参数元素名称,与简单的类名相比,这里有一个更明确的示例(现在在hibernate中工作,不需要解决方案)
从项目prj中选择prj,其中类型(prj)=LargeProject
,或者使用in
从项目prj中选择prj,其中类型(prj)位于(MediumProject,LargeProject)
这并没有给一个五年前的问题添加任何新内容。我只是想警告那些想使用建议的解决方案(在jpa 2中使用TYPE)的人,对于更复杂的查询,仍然存在一个问题(我在这个线程中使用解决方案时遇到了这个问题)。你说得对,问题中的查询没有暴露出这个问题。@WimDeRammelaere在几个小时的挠头之后,你的回答帮助我找到了查询中的问题。底线是,当我在where子句中使用type时,它在应用于联接时起作用,但在路径表达式中使用时找不到任何结果。
select sfp from SpoForeignPilot sfp join sfp.partDocument doc where TYPE(doc) = :type
@Query("SELECT p FROM BaseUserEntity p where p.class=:discriminatorValue")
    public List<BaseUserEntity> findByDiscriminatorValue(@Param("discriminatorValue") String discriminatorValue);