2011-02-02 59 views
14

沒有人知道是否以及如何使用hibernate標準API編寫following question(寫入JPA API)的解決方案?Hibernate API中的ElementCollection createAlias API

更具體我有一個包含與會者名單(這是一個用戶名列表)一個討論的實體:

@ElementCollection 
@Column(name = "user_name") 
@CollectionTable(name = "DISCUSSION_USER", joinColumns = @JoinColumn(name = "DISCUSSION_ID")) 
@OrderColumn(name = "ORDER_INDEX") 
private List<String> participants = new ArrayList<String>(); 

現在我需要檢索的所有討論,其中一個給定的用戶名是一個參與者。

如果我已經創建了一個實體參與者,這將是直截了當:

Criteria crit = getSession().createCriteria(Discussion.class); 
    crit.createAlias("participants", "p"); 
    crit.add(Restrictions.eq("p.userName", portalUsername)); 

但我不能創建一個非實體的名稱...

回答

2

至於解釋here我想要的東西是不可能的:

使用,而不是一個一對多的ElementCollection的侷限性是目標對象不能是查詢,堅持,獨立於其父對象進行合併。它們是嚴格私有的(依賴)對象,與嵌入式映射相同。在ElementCollection上沒有級聯選項,目標對象總是被持久化,合併,與父級一起移除。

所以,我用一個OneToMany代替。

1

你能給我們一個更完整的模式和查詢?

此外,Criteria API很糟糕。嘗試使用QueryDSL,您的查詢可能是這樣的:

HibernateQuery q=new HibernateQuery(getSession()) 
.from(QDiscussion.discussion).from(QDocument.document) 
.where(QDocument.document.userName.in(QDiscussion.discussion.userNames)) 
.list(QDocument.document); 
24

最後回答。

收集(通過@ElementCollection註釋)正確propertyName爲"elements"或恆定CollectionPropertyNames#COLLECTION_ELEMENTS

與下列答案

Criteria crit = getSession().createCriteria(Discussion.class); 
crit.createAlias("participants", "p"); 

crit.add(Restrictions.eq("p.elements", portalUsername)); 

嘗試或使用常量COLLECTION_ELEMENTS代替

crit.add(Restrictions.eq("p." + CollectionPropertyNames.COLLECTION_ELEMENTS, portalUsername)); 
+1

永遠不會太晚了一個很好的答案,我一定會一次嘗試了這一點 – 2012-05-17 18:26:30