2012-09-29 25 views
2

我有一個實體是這樣的:瞭解FetchType.Lazy,在JPQL查詢力(OpenJPA中)

public class Configuration { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "user_id") 
    @Element(name = "user_id", data = true, required = false) 
    private Users users; 
} 

我想是定義,其中一個時間執行惰性加載查詢,另一次不。

但查詢:

@NamedQuery(name = "getNondeletedConfiguration", query = "SELECT c FROM Configuration c " 
        + "LEFT JOIN c.users users WHERE c.deleted = false"), 

不會將用戶加載到該對象。

強制加載用戶對象的方法是訪問代碼中某處的屬性。然而,這是行不通的,我不希望這種行爲。我想僅基於我的JPQL語句來控制延遲加載。我不想讓openJPA神奇地加載對象,因爲它通過Java代碼中某處的get方法檢測到訪問。

我想這是一個常見問題,我只是誤解了一些東西。 但是,我找不到關於該問題的文檔。

回答

8

您需要添加fetch關鍵字加載關聯:

select c from Configuration c left join fetch c.users where c.deleted = false 

注意,對於代表一個用戶實體名稱Users真的選擇不當,很容易混淆。相同的字段名稱users。您應該刪除最後的s,這使得每個讀者都認爲配置有許多用戶。

+1

謝謝我發現這篇文章,但你是該死的權利:) http://eubauer.de/kingsware/2011/02/10/override-fetch-type-in​​-jpql-queries/有沒有辦法防止ManyToOne關係被取回?在另一個查詢中,我希望ManyToOne關係不會被獲取(即使可能有人調用「getUser(s)」)。有沒有類似的方式來告訴JPQL查詢中的openJPA無法獲取對象? –

+0

否。如果您需要,請使用DTO,而不是實體。 –

+0

謝謝你的回答JB,不幸的是,用戶的「s」命名約定是一個很老的設計錯誤,很難修復。 –