【发布时间】:2020-07-04 19:17:17
【问题描述】:
我有一个实体 Document 和 enum Label (不是我的真实案例,我使用的是类比)。文档可以有一组标签。 标签的映射如下:
@Entity
public class Document {
...
@ElementCollection(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@Column(name = "labels")
private Set<Label> labels = new HashSet<>();
...
}
这意味着标签被映射到具有两列(document_id,value)的单独表中,但在 Java 中它只是枚举
我需要选择没有任何列出标签的文档。 在 SQL 中它看起来像这样:
select D.id
from document D left join label L
on D.id = L.document_id and L.value in('label1','label2',...)
where L.document_id is null
但我不知道如何在 JPA Criteria API 中编写它。我不知道如何在标签表中表达外键。 JPA 谓词应该是这样的
CriteriaBuilder cd = ...
SetJoin<Object, Object> labelsJoin = root.joinSet("labels", JoinType.LEFT);
cb.and(labelsJoin .in("label1","label2"), cb.isNull(...???...)));
Here is my related SQL question
提前感谢您的建议。 卢卡斯
【问题讨论】:
-
最初您应该提供有效的映射。
@ElementCollection不应该与实体集一起使用。选择@OneToMany或ManyToMany。否则,您必须将标签更改为Set<String>。更多信息在这里callicoder.com/… -
标签是java枚举所以映射是正确的。对不起,我没有清楚地提到它。现在我的描述是固定的,更清楚了。
标签: java jpa join criteria-api