2012-06-19 25 views
0

JPQL查詢可以返回定製導致與NEW操作對象:等同於新的運營商使用存取器,而不是construtor

SELECT NEW myPackage.MyVO(e.fieldX, e.relationshipX.fieldY) 
    FROM MyEntity AS e 

這是養活虛擬組織是非常有用的。問題是,您必須創建與查詢投影的參數,順序和類型數量完全匹配的構造函數。當你對同一個VO使用很多投影時,這會開始變得混亂......要麼你的VO中有一個大的構造函數,並且在你的查詢中使用很多NULL文字,或者你的VO必須有很多不同的構造函數。

所以我的問題是:在JPQL有沒有辦法通過增強器而不是構造函數設置結果對象字段?

對於.NET背景的人來說,我期待着相當於LINQ + object initializers

回答

1

DataNucleus JPA肯定支持實例的結果不使用非標準的註釋對象兩種方式或來電,主要是由它也支持JDO的事實驅動,具有要求它: -

  1. 結果與argumented構造類型(如你所說)
  2. 用默認的構造函數結果類型,並與制定者

TypedQuery<MyResultType> q = em.createQuery("SELECT x AS field1, y AS field2 FROM ...", MyResultType.class); 

其中MyResultType具有setter「setField1」,「setField2」。

+0

這是DataNucleus的一個非常棒的功能,沒有非標準的API和我需要的行爲。我一定會嘗試大核。DataNucleus有任何機會將其作爲Persistence API的新功能[(當前JSR)](http://jcp.org/en/jsr/proposalDetails?id=338)。幸運的是,我們可以爲JPA 2.2或JPA 3創建標準:D。 –

+1

我沒有計劃要求,但你可以很容易。只需訪問http://java.net/projects/jpa-spec在問題跟蹤器中簡單提出一個「問題」,然後記下它,並且可以跟蹤 – DataNucleus

1

簡答您不能在JPQL中使用增變器。

雖然我不知道LINQ我不能看到這樣做不會造成混亂。

現在我確定你知道Classes可以有多個mutlple構造函數。那麼爲什麼不創建構造函數,你不會在null

根據您的需要和您正在使用的JPA實現,大多數提供程序確實提供了非標準方法。 Hibernate有@formula,在某些情況下,它被用來使用構造函數。

我正在使用JPA2,那麼標準查詢可能是一個更好的選擇,可以照顧這些類型的事情。您可能更喜歡使用@PostLoad

無論哪種方式,您都需要在SQL中不會發生這種對話,所以您並不真正將任何工作卸載到SQL。我們通常更喜歡這種方式,即讓SQL在單擊時做盡可能多的工作。

是的,這些是我的概括和具體的解決方案或要求可能不適合。

+1

+1因爲規範中沒有此類功能。 –