У меня есть сущность 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 это просто enum
Мне нужно выберите документы, которые НЕ имеют ни одной из перечисленных меток. В 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. Я не знаю, как express внешний ключ в таблице меток. Предикат JPA должен выглядеть примерно так:
CriteriaBuilder cd = ...
SetJoin<Object, Object> labelsJoin = root.joinSet("labels", JoinType.LEFT);
cb.and(labelsJoin .in("label1","label2"), cb.isNull(...???...)));
Вот мой связанный SQL вопрос
Заранее спасибо за ваши предложения. Lukas