Это, кажется, хорошо известная проблема в течение многих лет, о чем можно прочитать здесь: http://blog.xebia.com/2008/12/11/sorting-and-pagination-with-hibernate-criteria-how-it-can-go-wrong-with-joins/
И даже находит ссылку в часто задаваемых вопросах:
https://community.jboss.org/wiki/HibernateFAQ-AdvancedProblems#Hibernate_does_not_return_distinct_results_for_a_query_with_outer_join_fetching_enabled_for_a_collection_even_if_I_use_the_distinct_keyword
Это также обсуждалось ранее на SO
Как получить отличные результаты в спящем режиме с объединениями и ограничением на основе строк (подкачкой страниц)?
Проблема в том, что дажеИзучив все эти ресурсы, я не смог решить свою проблему, которая, кажется, немного отличается от этой стандартной проблемы, хотя я не уверен.
Стандартное решение, предлагаемое здесь, включает создание двух запросов.сначала - для получения различных идентификаторов, а затем для их использования в запросах более высокого уровня, чтобы получить желаемую нумерацию страниц.Классы гибернации в моем случае - что-то вроде
A
- aId
- Set<B>
B
- bId
Мне кажется, что подзапрос, кажется, работает нормально для меня и в состоянии получить различные идентификаторы, но внешний запрос, который должен делатьразбиение на страницы снова приводит к получению дубликатов, и, таким образом, отдельный подзапрос не имеет никакого эффекта.
Предполагая, что у меня есть один объект A, который имеет набор из четырех объектов B, мой анализ таков, что из-за введения набора при выборке данных для
session.createCriteria(A.class).list();
hibernate заполняет четыре ссылки всписок, указывающий только на один объект.Из-за этого стандартное решение не работает для меня.
Может ли кто-нибудь помочь найти решение для этого случая?
Редактировать: я решил сделать пагинацию самостоятельно из отдельного набора результатов.Другим не менее плохим способом могла быть ленивая загрузка объектов B, но для этого потребовались бы отдельные запросы для всех объектов A для получения соответствующих объектов B