Hibernate Criteria gibt doppelte Bestellungen mit FetchType.EAGER zurück
Frage:
Beim Festlegen der Abruftyp der orderTransactions-Liste einer Bestellung zu FetchType.EAGER, warum erscheinen die Bestellungen mehrmals in der resultierenden Liste, die mithilfe von Kriterien abgerufen wurde?
Antwort:
Dieses Verhalten ist erwartet. Mit FetchType.EAGER wird ein Join durchgeführt, um die orderTransactions eifrig abzurufen. Dies führt zu der gleichen Anzahl von Ergebnissen wie ein Standard-SQL-Join, bei dem jede Bestellung im Ergebnissatz für jede entsprechende orderTransaction vorhanden ist.
Um dies zu verstehen, betrachten Sie die generierte SQL-Anweisung:
SELECT o.*, l.* from ORDER o LEFT OUTER JOIN LINE_ITEMS l ON o.ID = l.ORDER_ID
In dieser Anweisung werden für jede Bestellung alle zugehörigen Einzelposten abgerufen, was zu mehreren Instanzen derselben Bestellung im Ergebnissatz führt.
Lösung zum Erhalten eindeutiger Ergebnisse:
Um doppelte Ergebnisse mit FetchType.EAGER herauszufiltern, können Sie einen Sammlungstyp verwenden, der die Einfügereihenfolge beibehält, z. B. LinkedHashSet:
Collection<Order> result = new LinkedHashSet( session.createCriteria(Order.class) .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow())) .list() );
Das obige ist der detaillierte Inhalt von## Warum geben Hibernate-Kriterien mit FetchType.EAGER doppelte Bestellungen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!