Ich habe zwei Entitäten lassen sagen A und B, abgebildet, wie unten:Ist es gültig Verhalten von Hibernate (JPQL Query OneToMany)
public class A{
...
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL)
Set<B> bs
}
public class B{
...
String someProp;
...
@ManyToOne
@JoinColumn(name = "A_ID")
A a
}
Einige Entitätsinstanz von A hat zwei Elemente von B in einer Datenbank.
Wenn ich ausführen einfache Abfrage für A wie:
entityManager.createQuery("SELECT a FROM A a WHERE a.id = 1").getSingleResult();
und alles wie erwartet funktioniert, habe ich eine Instanz mit zwei Instanzen von B im Set, aber wenn ich ausgeführt Abfrage:
Query query = entityManager.createQuery("SELECT a FROM A a JOIN FETCH a.bs b WHERE b.someProp= :somePropParam");
query.setParameter("somePropParam","somePropValue");
query.getResultList();
Ich habe Instanz von A mit einem Element von B in der Menge (Element, nach dem ich frage).
I modifizierte Abfrage:
entityManager.createQuery("SELECT b.a FROM B b JOIN b.a a WHERE b.someProp = :somePropParam.. more a conditions);
//.... this query works.
Sollten alle Instanzen von B nicht erste Abfragelast? Sollte Hibernate keine zusätzliche Abfrage ausführen, um alle zu laden?
in A. zu bauen, wenn die A, der zurückgegeben wird (durch eine Abfrage, die A als Rückgabetyp hat) hat wirklich zwei Elemente in seiner Sammlung dann, wenn Sie das Sammelgebiet der Zugang zurückgegebenes Objekt sollten Sie _always_ immer 2 Elemente finden. –
Ich denke, es sollte 2 Element in "bs" Satz von A zurückgeben, aber es gibt nur einen zurück, da es von '/ ** Spalten von a und b **/ von A eine innere Verbindung A b auf a zurückgegeben wurde .id = b.a_id wo b.someProp = 'someProperty'' Es gibt keine zusätzliche Abfrage, um zusätzliche B-Tabellenzeilen zu laden, die NICHT die Bedingung 'b.someProp =' someProperty'' erfüllen –
Es könnte" erwartetes Verhalten "sein in Hibernate aber sicherlich nicht in anderen Implementierungen ... –