2011-02-02 58 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