2014-04-01 23 views
0

我正在嘗試學習Java Persistance API。因此它寫在JPA 2.1規範的第174頁上:聯接到JPA2.1規範中的嵌入類 - ContactInfo - 收集值路徑必須解析爲關聯字段

在以下示例中,contactInfo表示由地址和 電話組成的可嵌入類。電話是一個實體。

SELECT p.vendor FROM Employee e JOIN e.contactInfo.phones p 
WHERE e.contactInfo.address.zipcode = '95054' 

以下查詢等效於上面的查詢:

SELECT p.vendor FROM Employee e JOIN e.contactInfo c JOIN c.phones p WHERE e.contactInfo.address.zipcode = '95054' 

然後176頁: 下面的查詢加入了員工的ContactInfo和電話。 ContactInfo是一個可嵌入的類,由一個地址和一組電話組成。電話是一個實體。

SELECT p.vendor FROM Employee e JOIN e.contactInfo c JOIN c.phones p WHERE c.address.zipcode = '95054' 

所以當我嘗試執行這樣的查詢只有第一個作品。最後兩個查詢會導致錯誤: 線程「main」中的異常java.lang.IllegalArgumentException:在EntityManager中創建查詢時發生異常: 異常說明:編譯問題[SELECT p.vendor FROM Employee e JOIN e.contactInfo c JOIN c.phoneNumbers p WHERE c.address.zipcode ='zip2']。 [37,50] 集合值路徑'e.contactInfo'必須解析爲關聯字段。

任何人都可以解釋爲什麼是這樣嗎?我也嘗試重現了規範中可嵌入類的其他連接示例,但始終得到相同的錯誤。

謝謝 最好的問候

回答

0

嵌入式不能用於連接操作。

如果您說contactInfo是可嵌入的,則無法完成。

SELECT p.vendor FROM Employee e JOIN e.contactInfo 

而且

SELECT p.vendor FROM Employee e JOIN e.contactInfo.phones p WHERE e.contactInfo.address.zipcode = '95054' 

不等同於

SELECT p.vendor FROM Employee e JOIN e.contactInfo c JOIN c.phones p WHERE e.contactInfo.address.zipcode = '95054' 

e.contactInfo.phones應該是一個收藏價值,同時e.contactInfo僅僅是一個可嵌入

可能是的ContactInfo的映射是什麼喜歡這個。

@Embeddable 
public class ContactInfo{ 
@OneToMany 
private Collection<Phone> phones; 
} 
+0

感謝您的回覆。是的,在連接中使用可嵌入的類似乎是不可能的。但正如你所看到的那樣,在規範中未修改的引用中,反覆聲明ContactInfo是一個可嵌入類。第459頁有它的代碼。爲什麼這個規範和它的實現之間存在這種差異? – user3120128

+0

從哪裏獲得這些規範,我檢查了Oracle的官方和那些網頁並沒有說什麼類似的http://download.oracle.com/otn-pub/jcp/persistence-2_1-pr-spec/JavaPersistencePDR.pdf?AuthParam = 1396453203_b4a67c5141154ebe083305894e1644f6 – Koitoer

+0

您提供的鏈接是公共評論草案。最終版本在這裏:https://jcp.org/aboutJava/communityprocess/final/jsr338/index。html – user3120128

相關問題