2011-06-29 25 views
7

我有一個實體名稱地址。地址實體有幾個字段,其中之一是CITY。我通過調用entityManager.createQuery創建了一個查詢,但我的查詢僅包含select子句中的CITY字段(因爲我只想加載該字段)。 CITY字段的類型是String。當我得到我的resultList時,我沒有得到一個Address對象列表,而是一個Object []的列表。JPA 2.0:加載實體的字段子集

有什麼辦法可以創建地址列表而不是Object []列表?我的JPA提供程序是休眠,最新版本。我想要一個不需要使用任何Hibernate特定的解決方案。

+0

JPA沒有「fetch-groups」,所以你不能這麼做......除了將除「city」之外的所有字段定義爲LAZY加載之外。顯然,用JDO你可以做到這一點 – DataNucleus

回答

2

如果你申請城市,Hibernate會如何加載地址實例? JPA實體是對象,並且對象應該遵守不變量。例如,一個這樣的不變量可能是一個地址總是有一個ID,一條街等等。如果Hibernate加載了部分對象(只填充了城市屬性),那些不變量就會被破壞,你不能再依賴自己的代碼了。如果您嘗試將此類地址附加到另一個對象,或者您只是試圖將其刪除,因爲它甚至不再具有ID,您也會遇到各種問題。

所以簡短的答案是否定的:這是不可能的。

長的答案是,因爲Adress是一個POJO,所以您只需自行創建加載城市的地址,或者使用ResultTransformer。但是你會得到臨時的地址實例,而不是附加的地址實體。這是無數的錯誤和混亂,恕我直言,食譜。

+2

「......這是無數的錯誤和混亂的恕我直言,恕我直言......」你怎麼能說,不知道用例??? –

+1

因爲我在開發Hibernate應用程序方面的經驗告訴我,Hibernate不是一個簡單易用的工具,而且有時候Address被用作持久實體,並且作爲數據對象,其他時候當你或者一些初級開發者不得不維護時在兩年的代碼。但你是誰決定的。我只是在這裏幫忙。 –

+0

此外,您還沒有告訴我們爲什麼讓地址只包含城市屬性是一個好主意,而不是簡單地使用城市作爲字符串。 –

14

在查詢中這可能與構造函數表達式。通常情況下,您可以使用自定義的DTO,但它也應該與實體一起工作。首先建立在實體額外的構造函數只取所需字段:

public Address() { 
    //default constructor 
} 

public Address(String city) { 
    this.city = city; 
} 

你的查詢,則可能是這樣的:

select new your.package.Address(a.city) from Address a where ... 

注意,生成的對象沒有連接到EntityManager的,所以變化它不會自動持續。

+0

你應該接受這個答案,如果它你想要的。否則分享你的解決方案來幫助他人。 –