具有指定继承类型的Java/JPA |查询
我正在一个通用表“Sample”上构建一个查询,我有几个类型继承自这个表“SampleOne”、“SampleTwo”。 我需要一个类似以下的查询:具有指定继承类型的Java/JPA |查询,java,jpa,entitymanager,Java,Jpa,Entitymanager,我正在一个通用表“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将是表的鉴别器值。是否有可能以任何方式(并避免创建特定于实体的查询,每个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);