簡體   English   中英

Java / JPA | 查詢具有指定的繼承類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM