jpa criteria-Abfrage doppelte Werte in die Liste geholt
Kann ich beobachten, was ich denke, ist ein unerwartetes Verhalten in JPA 2 beim abrufen einer Liste Attribut mit einem Kriterium Abfragen.
Meine Abfrage sieht wie folgt aus (ein Auszug davon):
CriteriaBuilder b = em.getCriteriaBuilder();
CriteriaQuery<MainObject> c = b.createQuery(MainObject.class);
Root<MainObject> root = c.from(MainObject.class);
Join<MainObject, FirstFetch> firstFetch = (Join<MainObject, FirstFetch>) root.fetch(MainObject_.firstFetch);
firstFetch.fetch(FirstFetch_.secondFetch); //secondFetch is a list
c.select(root).distinct(true);
(Also sagen wir mal so ich bin das Holen einer Liste als Eigenschaft von der Eigenschaft eines Objekts.)
Die Sache ist, wenn die Abfrage mehrere Ergebnisse zurückgibt, secondFetch Werte sind doppelt so oft, wie Zeilen zurückgegeben werden. Jeder firstFetch sollte nur eine secondFetch aber hat n statt.
Die einzige Besonderheit sehe ich in diesem Fall alle MainObjects zufällig den gleichen FirstFetch Instanz.
Also meine Vermutung ist, dass der join gekreuzt werden, das ist normal, aber dann JPA ausfällt, abzutreten secondFetch Objekt jeder der firstFetchs.
Zuordnungen sollten nicht zu speziell, das sind mehr oder weniger so
@Entity
@Table(name="mainobject")
public class MainObject{
//...
private FirstFetch firstFetch;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="mainObject_column")
public FirstFetch getFirstFetch() {
return firstFetch;
}
}
und
@Entity
@Table(name="firstFetch")
public class FirstFetch{
//...
private List<SecondFetch> secondFetch;
@OneToMany(mappedBy="secondFetch")
public List<SecondFetch> getSecondFetch() {
return secondFetch;
}
}
& schließlich
@Entity
@Table(name="secondFetch")
public class SecondFetch {
//....
private FirstFetch firstFetch; //bidirectional
@ManyToOne
@JoinColumn(name="column")
public FirstFetch getFirstFetch() {
return firstFetch;
}
}
Ich habe auf der Suche nach irgendeiner Art von verschiedene Satz zu wenden, die Holen aber es gibt keine (wäre ein 'patch' sowieso...)
Wenn ich
List<SecondFetch>
für
Set<SecondFetch>
ich werde das erwartete Ergebnis Dank des Sets " Schlüssel, also ich habe das Gefühl, dies ist ein Fehlverhalten in der JPA-Listen.
Ich bin kein Experte, aber so konnte ich perfectlly machen einige Fehler in den Zuordnungen oder Abfragen.
Jedes Feedback ist sehr willkommen, um zu helfen deaktivieren Sie dieses aus.
Danke.
- Was JPA-provider verwenden Sie? Könnte ein bug sein.
- ich bin mit JBoss 6.1.0 Standard-Anbieter, die wäre Hibernate 3.6.6 Finale, wenn ich mich nicht falsch.
- Ich habe genau das gleiche problem. Ich bin mit criteria api zum abrufen der (zweiten) Liste wie diese: d.fetch(FirstFetch_.secondFetch, JoinType.LINKS);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte genau das gleiche problem obwohl ich mit JPA criteria API zu tun, die Abfrage.
Nach einiger recherche habe ich eine Lösung gefunden, die Sie bereits erwähnt haben (war aber nicht verfügbar, da Ihr nicht mit Hilfe von Kriterien API): Mit
distinct
.Mit JPA criteria würde es so Aussehen:
Ohne Verwendung
query.distinct(true);
die Ergebnismenge wurde multipliziert mit der Anzahl der Objekte in dersecondFetch
Liste.Hibernate hat so etwas wie
DISTINCT_ROOT_ENTITY
dem sound mehr als ausreichend, nur das setzen der Abfrage distinct. Aber ich habe nicht weiter untersucht. Ich bin auch mit Hibernate als JPA-provider. Vielleicht ist die Einstellung derquery
deutlich in der PPV endet mit dem gleichen code wie ÜberwintertDISTINCT_ROOT_ENTITY
würde?