如何在 Criteria API 中的集合属性上编写 EXISTS 谓词?

How can I write an EXISTS predicate on a collection attribute in Criteria API?

我有这些 类:

@Entity
public class Customer {

    @Id long id;

    String name;

    @OneToMany List<Customer> related;

}

我正在使用这个 JPQL 查询:

select c from Customer c where c.name = 'ACME'
    or exists( select 1 from c.related r where r.name = 'ACME' )

如何使用条件 API 编写相同的查询?我需要将 exists 与子查询一起使用,例如 JPQL,但我不知道如何从 Criteria API.

中的集合属性创建子查询

这样的事情会给 EXISTS (subquery)

Subquery<Long> sq = cq.subquery(Long.class);
Root<Customer> customerSub = sq.correlate(customer);
Join<Customer,Customer> related = customerSub.join(Customer_.related);
... extra config of subquery

Predicate existsCustomer = cb.exists(sq);

其中 cqCriteriaQuerycbCriteriaBuilder。这来自 JPA 2.1 规范 p323 示例 4

中的示例