У меня возникла проблема с запросами JPA-2.0 с отношениями. Как можно было бы выбрать любой Dataset
с по крайней мере одним Event
с type = B
?JPA-2.0 Simple Select-Where question
@Entity
class Dataset {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "dataset")
public List<Event> events;
}
@Entity
class Event {
@ManyToOne
@JoinColumn
public Dataset dataset;
public Type type;
}
enum Type {
A, B, C
}
Моя отправная точка
CriteriaBuilder _builder = em.getCriteriaBuilder();
CriteriaQuery<Dataset> _criteria = _builder.createQuery(Dataset.class);
// select from
Root<Dataset> _root = _criteria.from(Dataset.class);
_criteria.select(_root);
// apply some filter as where-clause (visitor)
getFilter().apply(
_root, _criteria, _builder, em.getMetamodel()
);
// how to add a clause as defined before?
...
Любые идеи по этому поводу. Я попытался создать подзапросы, а также присоединиться, но я как-то сделал это неправильно и всегда получал все наборы данных в качестве результата.
Похоже, что OP пытается использовать API критериев здесь. –
Спасибо, это сработало для меня. Я также понял, почему мой подход не удался. Я попытался повторно использовать уже выполненный запрос и добавил другое предложение. Hibernate не жаловался на это, но генерировал неправильные псевдонимы (основной запрос и подзапрос имели один и тот же псевдоним, который, очевидно, терпит неудачу). – Jan
Вам нужно добавить 'subquery.select (eventRoot);', а также проверить ваши скобки в предикате 'correlatePredicate'. Наконец, 'builder.not (builder.exists (subQuery))' должен был быть без _not_. Большое вам спасибо за помощь. – Jan