Это, кажется, хорошо известная проблема в течение многих лет, как можно прочитать здесь: http://blog.xebia.com/2008/12/11/sorting-and-pagination-with-hibernate-criteria-how-it-can-go-wrong-with-joins/Hibernate - отличные результаты с пагинацией
И даже находит упоминание в Hibernate часто задаваемые вопросы:
Это имеет также было обсуждено ранее на SO
How to get distinct results in hibernate with joins and row-based limiting (paging)?
Проблема в том, что даже после прохождения всех этих ресурсов я не смог решить свою проблему, которая, похоже, немного отличается от этой стандартной проблемы, хотя я не уверен.
Стандартное решение, предлагаемое здесь, включает в себя создание двух запросов, сначала для получения отдельных идентификаторов, а затем с использованием запросов более высокого уровня для получения желаемой разбивки на страницы. Классы зимуют в моем случае это что-то вроде
A
- aId
- Set<B>
B
- bId
Мне кажется, что подзапрос, кажется, работает хорошо для меня, и быть в состоянии получить различный СПИД, но внешний запрос, который, как предполагается сделать пагинацию снова извлекает дубликаты, и, следовательно, отдельный в подзапросе не оказывает никакого эффекта.
Предполагая, что у меня есть один Объект, который имеет набор из четырех B объектов, Мой анализом является то, что из-за введение набора, в то время выборки данных для
session.createCriteria(A.class).list();
Гибернации заселения четыре ссылки в список, указывающий на всего один объект. Из-за этого стандартное решение терпит неудачу для меня.
Может ли кто-нибудь помочь в решении проблемы для этого случая?
Редактирование: Я решил пойти для того, чтобы делать разбивку на страницы из отдельных результатов. Другой столь же плохой путь мог быть ленивой нагрузкой объектов В, но это потребовало бы отдельные запросов для всех объектов А для извлечения соответствующего B объекты
Я использовал это также в подзапросе. Мой подзапрос работает нормально и возвращает уникальные идентификаторы. Проблема заключается в том, что внешний запрос извлекает дубликаты. Например, если подзапрос возвращает A.ids = 1,2,3, тогда основной запрос (который используется для разбивки на страницы) извлекает дубликаты Aids, такие как 1,1,1,2,2,3,3,3 и, следовательно, полный запрос формы Выберите A. * из A, где A.id в (подзапросе) предел 10; не удается получить уникальные записи A. – Ashish
. Окончательный запрос должен выглядеть так: выберите a. * из где a.id в (: ids), а запрос для получения идентификаторов A должен выглядеть так: выберите a.id из A предел 10. Так что применяйте Limit только к идентификаторам, а не к окончательному запросу. – szhem
мой окончательный запрос имеет вид select a. * Из левого внешнего соединения b на a.id = b.aid, и для этого требуется полный объект A. – Ashish