2012-06-09 14 views
6

如何針對給定NamedQuery強制執行延遲加載策略。JPA - 僅爲給定查詢強制延遲加載

例如。考慮下面的僞代碼(只是爲了解釋的情況下) 我有一個實體

@Entity 
class Xyz { 
int a; 
int b; 

@Fetch = EAGER 
Set<ABC> listOfItems; 
} 

在這種情況下,我們已經聲明LISTOFITEMS是預先抓取。

現在假設,我有一個NamedQuery (query="getXyz" , name="select x from Xyz x where a=?") 對於這個查詢,我只需要結果是懶惰的,即我不想要檢索listOfItems。

我能達到什麼樣的目標? PS: 1.我不想改變LISTOFITEMS偷懶的實體類 2.我不想提前選擇喜歡name="select a,b from Xyz z where a = ? "

由於在查詢具體領域的建議

+0

你打算如何處理NamedQuery的結果?您可能會嘗試實現替代方案。 – siebz0r

+0

@ siebz0r我只想顯示第一級字段。而有其他顯示需要取集。在我的情況下,我想通過不急於提取它們來提高性能。如果您有任何建議,請分享。謝謝 ! –

+0

我會建議將該集註釋爲懶惰。爲什麼這不可能? – siebz0r

回答

1

如果你不想急於獲取Set,你必須將其定義爲懶惰。但是請注意,當您指定lazy時,允許實現獲取。

引述規格:

公共枚舉FetchType 擴展java.lang.Enum

定義策略,從數據庫中提取數據。 EAGER策略是持久性提供程序運行時的一項要求,即必須急切地提取數據。 LAZY策略是持久性提供程序運行時的一個暗示,即數據應該在第一次訪問時被延遲取出。允許實現熱切地獲取已經指定了LAZY策略提示的數據。

不過,若你不想取這樣一個Set我會作爲一種替代創建一個小型類來滿足您的需求:

@Entity 
@Table(name = "XYZ") 
public class XyzStub 
{ 
    int a; 
    int b; 
} 

您可以查詢該使用TypedQuery:

EntityManager em; 
//.... 
TypedQuery<XyzStub> q = em.createNamedQuery("select x from XyzStub x where x.a = :a", XyzStub.class) 
q.setParameter("a", a);