簡體   English   中英

具有繼承的實體的JPA本機查詢

[英]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獲取所有屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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