Ich werde jetzt eine andere Lösung erläutern, bei der Sie die normale Abfrage- und Paginierungsmethode verwenden können, ohne das Problem möglicherweise doppelter oder unterdrückter Elemente zu haben.
Diese Lösung hat den Fortschritt, dass es ist:
- schneller als die in diesem Artikel erwähnte PK-ID-Lösung
- behält die Reihenfolge bei und verwendet die 'in-Klausel' nicht für einen möglicherweise großen Datensatz von PKs
Den vollständigen Artikel finden Sie in meinem Blog
Der Ruhezustand bietet die Möglichkeit, die Methode zum Abrufen von Zuordnungen nicht nur zur Entwurfszeit, sondern auch zur Laufzeit durch eine Abfrageausführung zu definieren. Daher verwenden wir diesen Ansatz in Verbindung mit einem einfachen Relfektionsmaterial und können auch den Prozess des Änderns des Abrufalgorithmus für Abfrageeigenschaften nur für Sammlungseigenschaften automatisieren.
Zuerst erstellen wir eine Methode, die alle Sammlungseigenschaften aus der Entitätsklasse auflöst:
public static List<String> resolveCollectionProperties(Class<?> type) {
List<String> ret = new ArrayList<String>();
try {
BeanInfo beanInfo = Introspector.getBeanInfo(type);
for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
if (Collection.class.isAssignableFrom(pd.getPropertyType()))
ret.add(pd.getName());
}
} catch (IntrospectionException e) {
e.printStackTrace();
}
return ret;
}
Anschließend können Sie mit dieser kleinen Hilfsmethode Ihrem Kriterienobjekt empfehlen, den FetchMode für diese Abfrage in SELECT zu ändern.
Criteria criteria = …
for (String property : ReflectUtil.resolveCollectionProperties(YourEntity.class)) {
criteria.setFetchMode(property, org.hibernate.FetchMode.SELECT);
}
criteria.setFirstResult(firstResult);
criteria.setMaxResults(maxResults);
criteria.list();
Dies unterscheidet sich von der Definition des FetchMode Ihrer Entitäten zur Entwurfszeit. Sie können also das normale Abrufen von Verknüpfungszuordnungen für Paging-Algorithmen in Ihrer Benutzeroberfläche verwenden, da dies meistens nicht der kritische Teil ist und es wichtiger ist, dass Ihre Ergebnisse so schnell wie möglich vorliegen.