ElementCollection createAlias in hibernate API

2022-09-03 04:26:29

有谁知道是否可以以及如何使用休眠标准API编写以下问题(在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));

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


答案 1

迟到的答案。

集合的正确属性名称(由@ElementCollection注释)是“元素”或常量集合属性名称#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));

答案 2

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

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

所以,我用了OneToMany代替。


推荐