是否有人知道是否以及如何使用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));
但我不能用非实体创建别名......
答案 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);