Je suis bloqué par un problème concernant les requêtes JPA-2.0 avec les relations. Comment serait-il possible de sélectionner un Dataset
avec au moins un Event
avec 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
}
Mon point de départ est
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?
...
Toutes les idées sur ce sujet. J'ai essayé de créer une sous-requête ainsi qu'une jointure, mais je l'ai mal fait et j'ai toujours obtenu tous les jeux de données comme résultat.
Il semble que l'OP essaie d'utiliser l'API Criteria ici. –
Merci, ça a marché pour moi. J'ai aussi compris pourquoi mon approche a échoué. J'ai essayé de réutiliser une requête déjà exécutée et ajouté une autre clause. Hibernate ne s'en est pas plaint, mais a généré de faux alias (la requête principale et la sous-requête avaient le même alias, ce qui échoue évidemment). – Jan
Vous devez ajouter 'subquery.select (eventRoot);' ainsi que vérifier vos parenthèses au prédicat 'correlatePredicate'. Enfin le 'builder.not (builder.exists (subQuery))' aurait du être sans _not_. Merci beaucoup pour votre aide. – Jan