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

时间:2016-10-13 16:18:15

标签: jpa jpql 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' )

如何使用Criteria API编写相同的查询?我需要将exists与子查询一起使用,例如JPQL,但我不知道如何从Criteria API中的集合属性创建子查询。

1 个答案:

答案 0 :(得分:0)

这样的事情会给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中的示例