在hibernate API中的ElementCollection createAlias

时间:2011-02-02 10:04:13

标签: java hibernate criteria jpa-2.0

是否有人知道是否以及如何使用hibernate条件API编写following question(使用JPA 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));

但我不能用非实体创建别名......

3 个答案:

答案 0 :(得分:27)

迟到的答案。

集合的正确propertyName(由 @ElementCollection 注释)为 "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 :(得分:2)

正如here所解释的那样,我想要的是不可能的:

  

使用ElementCollection而不是OneToMany的限制是无法独立于父对象查询,保留,合并目标对象。它们是严格的私有(依赖)对象,与嵌入式映射相同。 ElementCollection上没有级联选项,目标对象始终保持,合并,与父级一起删除。

所以,我使用的是OneToMany。

答案 2 :(得分: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);