2017-09-13 1 views
0

J'ai une relation OneToMany entre les entités: Zone et Réservation. Zone a beaucoup de réservations (ou aucun) et la réservation a une zone. Je voudrais interroger tous les domaines, mais pour chaque domaine, je n'aurais que les réservations qui remplissent une condition.Comment obtenir une seule entité mais une relation filtrée dans JPQL

Jusqu'à présent, je l'ai essayé quelque chose comme ceci:

em.createQuery("SELECT DISTINCT a FROM Area a LEFT JOIN a.reservations r WHERE r.startDate < :fromDate") 
       .setParameter("fromDate", fromDate, TemporalType.TIMESTAMP) 
       .getResultList(); 

Mais il ne reviendra pas ces zones qui ne dispose pas des réserves qui FULLFILL la condition.

Répondre

0

Ceci est parce que votre requête a Si clause, qui ne renvoie pas les enregistrements qui est présent dans la région mais pas dans Réservation.

Vous voulez quelque chose qui peut-être JPA ne supporte pas ON clause au lieu de .

JPA JPQL ne supporte pas les relations arbitraires entre l'objet étant défini dans le "sur" clause

Alors, quelle pourrait être la solution pour cela:

En utilisant SQL Recherche au lieu de JPQL.

Essayez quelque chose en utilisant ci-dessous en fonction de vos objets et tables valeur du champ:

em.createSQLQuery("SELECT DISTINCT a.area_name FROM area a LEFT JOIN a.reservations r ON r.start_date< :fromDate") 
       .setParameter("fromDate", fromDate, TemporalType.TIMESTAMP) 
       .getResultList(); 
0

Vous ne peux pas remplir une partie collection @OneToMany. Puisque vous avez une relation bi-direcational, vous pourriez interroger les entités dans l'autre sens de réservations:

SELECT r FROM Reservation r WHERE r r.startDate < :fromDate 

De cette façon, vous avez seulement les réservations, répondant à vos besoins mais avec les zones non distinctes.