Теперь я объясню другое решение, в котором вы можете использовать обычный метод запроса и разбиения на страницы, не имея проблемы с возможными дубликатами или подавленными элементами.
Это решение имеет преимущество:
- быстрее, чем решение PK id, упомянутое в этой статье
- сохраняет порядок и не использует 'в предложении' на возможно большом наборе данных PK
Полная статья может быть найдена на мой блог
Hibernate дает возможность определять метод выборки ассоциаций не только во время разработки, но и во время выполнения путем выполнения запроса. Таким образом, мы используем этот подход в сочетании с простым средством улучшения, а также можем автоматизировать процесс изменения алгоритма извлечения свойств запроса только для свойств коллекции.
Сначала мы создаем метод, который разрешает все свойства коллекции из класса сущностей:
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;
}
После этого вы можете использовать этот маленький вспомогательный метод и посоветуйте объекту критериев изменить FetchMode на SELECT для этого запроса.
Criteria criteria = …
// … add your expression here …
// set fetchmode for every Collection Property to SELECT
for (String property : ReflectUtil.resolveCollectionProperties(YourEntity.class)) {
criteria.setFetchMode(property, org.hibernate.FetchMode.SELECT);
}
criteria.setFirstResult(firstResult);
criteria.setMaxResults(maxResults);
criteria.list();
Это отличается от определения FetchMode ваших сущностей во время разработки. Таким образом, вы можете использовать обычную выборку объединяющих объединений для алгоритмов подкачки в вашем пользовательском интерфейсе, поскольку в большинстве случаев это не критическая часть, и более важно, чтобы ваши результаты были как можно быстрее.