在hibernate API中的ElementCollection createAlias

Sti*_*ens 14 java hibernate criteria jpa-2.0

有谁知道是否以及如何使用hibernate标准API编写以下问题的解决方案(使用JPA API编写)?

更具体地说,我有一个Discussion实体,其中包含一个参与者列表(这是一个用户名列表):

@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>();
Run Code Online (Sandbox Code Playgroud)

现在我需要检索给定用户名是参与者的所有讨论.

如果我为参与者创建了一个实体,这将是直截了当的:

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

但是我无法用非实体创建别名......

lsc*_*hin 28

迟到的答案.

集合的正确propertyName(由@ElementCollection注释)是"elements"或者常量CollectionPropertyNames#COLLECTION_ELEMENTS.

尝试以下答案

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

crit.add(Restrictions.eq("p.elements", portalUsername));
Run Code Online (Sandbox Code Playgroud)

或者使用常量COLLECTION_ELEMENTS代替

crit.add(Restrictions.eq("p." + CollectionPropertyNames.COLLECTION_ELEMENTS, portalUsername));
Run Code Online (Sandbox Code Playgroud)

  • 我猜你可以在Hibernate 4中执行此操作,而不是Hibernate 3 (3认同)

Sti*_*ens 2

正如这里所解释的,我想要的是不可能的:

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

所以,我改用了 OneToMany。