[英]JPA Native Query for Entity with Inheritance
我有一個實體類和一個基於該實體的子類:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class A
和
@Entity
public class B extends A
我需要發出一個僅在基類(A)上使用存儲過程的本機查詢。 如果我嘗試如下:
entityManager.createNativeQuery("select * from A a where procedure(f)",A.class).getResultList()
我收到有關“在ResultSet中找不到列clazz_”的錯誤。 我假設JPA提供程序添加此列以區分基類和擴展類。 我可以通過顯式添加clazz列和子類中的所有字段來解決此問題:
entityManager.createNativeQuery("select *,1 as clazz_,null as prop1,null as prop2 from A a where procedure(f)",A.class).getResultList()
其中“prop1”和“prop2”是子類B的屬性。但是,這似乎是一種不必要的破解,如果子類B發生變化,則容易出現維護問題。
我的問題是:如何在已定義繼承的實體上使用存儲過程進行查詢?
正如您可能已經看到的那樣,Hibernate團隊並未在定義您如何執行此操作方面投入大量精力。文檔只是說明:
16.1.6。 處理繼承
查詢作為繼承的一部分映射的實體的本機SQL查詢必須包括基類及其所有子類的所有屬性。
因此,如果你想使用Native查詢,你看起來就像是在做這樣的事情。 關於子類B改變的關注,也許稍微不那么繁重的實現方法是嘗試在共享ID屬性上使用LEFT OUTER JOIN語法:
entityManager.createNativeQuery("select a.*, b*, 1 as clazz_, from A a LEFT OUTER JOIN B b on id = a.id where procedure(f)",A.class).getResultList()
這樣,如果添加或刪除某些屬性,您將始終從B獲取所有屬性。
您需要使用鑒別器來區分A的實例和B的實例。 使用以下注釋之一:
@DiscriminatorValue
http://docs.oracle.com/javaee/5/api/javax/persistence/DiscriminatorValue.html
@DiscriminatorColumn
https://docs.oracle.com/javaee/5/api/javax/persistence/DiscriminatorColumn.html
@DiscriminatorFormula
http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e1168
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.