Hibernate Criteria gibt mehrere wiederholte Bestellungen mit FetchType.EAGER zurück
Problem:
Bei der Verwendung ein Hibernate-Kriterium mit FetchType.EAGER für eine Eins-zu-viele-Beziehung, die resultierende Liste enthält mehrere Kopien desselben Order-Objekts.
Originalcode:
<code class="java">public List<OrderTransaction> getOrderTransactions() { return orderTransactions; }</code>
Geänderter Code mit FetchType.EAGER:
<code class="java">public List<OrderTransaction> getOrderTransactions() { return orderTransactions; }</code>
Frage:
Warum führt der geänderte Code mit FetchType.EAGER zu mehreren Kopien des Order-Objekts?
Antwort:
Dieses Verhalten wird erwartet, wenn Eager Fetching aktiviert wird. Zwischen den Tabellen „Order“ und „OrderTransaction“ wird ein Join durchgeführt, der zur gleichen Anzahl von Zeilen führt wie ein regulärer SQL-Join. Daher erscheint jedes Order-Objekt entsprechend der Anzahl der zugehörigen OrderTransaction-Datensätze mehrmals.
Erklärung:
Beim Abrufen von Daten mit FetchType.EAGER wird ein äußerer Join verwendet . Dies bedeutet, dass eine Bestellung auch dann im Ergebnissatz enthalten ist, wenn sie keine zugehörigen OrderTransaction-Datensätze aufweist. Das Ergebnis ist eine Liste von Order-Objekten, die jeweils möglicherweise mehreren OrderTransaction-Objekten zugeordnet sind.
Lösung:
Um mehrere Kopien des Order-Objekts zu vermeiden, sollten Sie die Verwendung eines Sets in Betracht ziehen anstelle einer Liste, um Duplikate zu vermeiden. Alternativ können Sie eine DistinctRootEntity in der Kriterienabfrage verwenden, die explizit die eindeutigen Order-Objekte angibt, die zurückgegeben werden sollen.
Beispiel:
<code class="java">Criteria criteria = getHibernateSession() .createCriteria(Order.class) .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));</code>
Das obige ist der detaillierte Inhalt von## Warum führen Hibernate-Kriterien mit FetchType.EAGER zu doppelten Bestellobjekten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!