Hibernate - отчетливые результаты с пагинацией

Похоже, это хорошо известная проблема уже много лет, о которой можно прочитать здесь: http://blog.xebia.com/2008/12/11/sorting-and-pagination-with-hibernate-criteria-how-it-can-go-wrong-with-joins/

И даже нашел упоминание в hibernate faqs:

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

Как получить разные результаты в hibernate с джойнами и ограничением на основе строк (paging)?

Проблема в том, что даже после просмотра всех этих ресурсов, я не смог решить свою проблему, которая, кажется, немного отличается от этой стандартной проблемы, хотя я не уверен.

Стандартное решение, предложенное здесь, включает создание двух запросов, сначала один для получения отдельных идентификаторов, а затем использование их в запросе более высокого уровня для получения желаемой пагинации. В моем случае классы hibernate выглядят примерно так

A
 - aId
 - Set

B
 - bId 

Мне кажется, что подзапрос работает нормально и позволяет получить отличительные идентификаторы, но внешний запрос, который должен сделать пагинацию, снова получает дубликаты, и таким образом отличительные данные в подзапросе не дают никакого эффекта.

Предположим, что у меня есть один объект A, который имеет набор из четырех объектов B. Мой анализ показывает, что из-за введения set, при получении данных для

session.createCriteria(A.class).list();

hibernate заполняет четыре ссылки в списке, указывающие только на один объект. Из-за этого стандартное решение для меня не работает.

Не мог бы кто-нибудь помочь придумать решение для этого случая?

Edit: Я решил сделать пагинацию самостоятельно из отдельного набора результатов. Другим не менее плохим способом могла быть ленивая загрузка объектов B, но это потребовало бы отдельных запросов для всех объектов A, чтобы получить соответствующие объекты B

6
задан Community 23 May 2017 в 12:18
поделиться