У меня есть следующее отношение, и мне нужно получить потребителей, у которых есть хотя бы одна покупка (как подзапрос, потому что это часть большего запроса).
@Entity
@Table(name = "consumers")
public class Consumer extends User {
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "consumer_id")
private List<Purchase> purchases;
}
и запрос
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Consumer> criteriaQuery = criteriaBuilder.createQuery(Consumer.class);
Root<Consumer> root = criteriaQuery.from(Consumer.class);`
Join<Consumer, Purchase> purchases = root.join(Consumer_.purchases, JoinType.LEFT);
sub.select(criteriaBuilder.count(purchases.get(Purchase_.id)));
sub.where(criteriaBuilder.equal(root.get(Consumer_.id), purchases.get(Purchase_.consumer).get(Consumer_.id)));
predicates.add(criteriaBuilder.greaterThanOrEqualTo(sub, 0L));