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);
InformationsquelleAutor comandante N | 2012-04-02
Schreibe einen Kommentar