Ich versuche, Hibernate zu verwenden, um ungefähr 100 Millionen Zeilen aus einer Tabelle abzurufen. Ich habe eine persistente Entität, die eine Sammlung von Gebühren enthält (eine andere persistente Entität). Vorausgesetzt, dass ich werde iterieren über das Ergebnis und Zugriff auf die Gebühren für jedes Objekt, möchte ich eifrig Gebühren abholen, um das n + 1 Problem zu vermeiden.Eager holen Sammlungen in Hibernate mit ScrollableResults
Ich sollte auch erwähnen, dass ich es zu einer anderen Tabelle namens Provider (Eins-zu-eins-Zuordnung aber kein Fremdschlüssel) beitreten möchte. Ich habe versucht:
String query = "select new " + Order.class.getName()
+ "(i, p) from Item i left join fetch i.fees f, Provider p where "
+ "p.factoryId=i.factoryId and p.factoryRef=i.factoryRef";
return session.createQuery(query).scroll();
Meine Order-Klasse enthält ein Provider-Feld und ein Item-Feld. Ich bekomme diese Fehlermeldung:
Caused by: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
Ich mag würde mit einer Liste der Ordnung, um am Ende der Artikel enthalten (mit den Gebühren eifrig geholt) und Provider.
Ich denke, diese Antwort ist richtig. Wenn dies der Fall ist, sollten Sie Hibernate wissen lassen können, dass Sie 'Item' tatsächlich holen, indem Sie die Abfrage so ändern, dass eine 'List' zurückgegeben wird, anstatt eine' Order' zu konstruieren: 'select i, p from ...'. Sie müssen dann die Bestellung manuell erstellen. –