Теперь я объясню другое решение, в котором вы можете использовать обычный метод запроса и разбивки на страницы, не опасаясь возможных дубликатов или подавленных элементов.
Преимущество этого решения в том, что оно:
- быстрее, чем решение PK id, упомянутое в этой статье
- сохраняет порядок и не использует предложение in в возможно большом наборе данных PK
Полную версию статьи можно найти на мой блог
Hibernate дает возможность определять метод выборки ассоциаций не только во время разработки, но и во время выполнения путем выполнения запроса. Таким образом, мы используем этот подход в сочетании с простыми средствами релаксации, а также можем автоматизировать процесс изменения алгоритма выборки свойств запроса только для свойств коллекции.
Сначала мы создаем метод, который разрешает все свойства коллекции из класса Entity:
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 ваших сущностей во время разработки. Таким образом, вы можете использовать обычную выборку ассоциации соединения для алгоритмов разбиения по страницам в пользовательском интерфейсе, потому что в большинстве случаев это не критическая часть, и более важно получить результаты как можно быстрее.
person
Andreas Hartmann-schneevoigt
schedule
06.07.2012