[英]Java /JPA | Query with specified inherited type
我在通用表“ Sample”上構建查詢,並且有幾種類型從該表“ SampleOne”,“ SampleTwo”繼承。 我需要類似的查詢:
select s from Sample where s.type = :type
其中type是表的鑒別值。 是否有可能(並且避免創建特定於實體的查詢,每個SampleOne,SampleTwo ...等等)
非常感謝您對此主題的投入,
親切的問候,P。
在JPA 2.0中,您可以使用TYPE
表達式(盡管當前它不適用於Hibernate中的參數,請參見HHH-5282 ):
select s from Sample s where TYPE(s) = :type
類似的特定於Hibernate的表達式是.class
:
select s from Sample s where s.class = :type
這是Java EE 6教程的相關部分 :
抽象實體
通過使用
@Entity
裝飾抽象類,可以將其聲明為實體。 抽象實體就像具體實體,但是不能實例化。可以查詢抽象實體,就像具體實體一樣。 如果抽象實體是查詢的目標,則查詢將對抽象實體的所有具體子類進行操作:
@Entity
public abstract class Employee {
@Id
protected Integer employeeId;
...
}
@Entity
public class FullTimeEmployee extends Employee {
protected Integer salary;
...
}
@Entity
public class PartTimeEmployee extends Employee {
protected Float hourlyWage;
}
如果我沒有看錯,您的查詢:
select s from Sample where s.type = :type
如果type
是discriminator列,則僅應返回指定子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);
其中BaseUserEntity
是您的父實體
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.