Esto parece ser un problema bien conocido durante años como se puede leer aquí: http://blog.xebia.com/2008/12/11/sorting-and-pagination-with-hibernate-criteria-how-it-can-go-wrong-with-joins/Hibernate - resultados distintos con paginación
Y incluso encuentra referencia en preguntas frecuentes de hibernación:
Esto tiene también ha discutido previamente en SO
How to get distinct results in hibernate with joins and row-based limiting (paging)?
El problema es que incluso después de pasar por todos estos recursos, no he podido resolver mi problema, que parece ser un poco diferente de este problema estándar, aunque no estoy seguro.
La solución estándar propuesta aquí implica la creación de dos consultas, la primera para obtener identificadores distintos y luego utilizarlos en una consulta de nivel superior para obtener la paginación deseada. Las clases de hibernación en mi caso son algo así como
A
- aId
- Set<B>
B
- bId
Me parece que la subconsulta parece estar funcionando bien para mí y está siendo capaz de obtener las ayudas distintas, pero la consulta externa que se supone que debe hacer la paginación vuelve a buscar los duplicados y, por lo tanto, lo distinto en la subconsulta no tiene ningún efecto.
Suponiendo que tengo una Un objeto que tiene un conjunto de cuatro B objetos, mi análisis es que, debido a la introducción del conjunto, mientras que ir a buscar datos para
session.createCriteria(A.class).list();
Hibernate es poblar cuatro referencias en la lista que apunta a solo un objeto Debido a esto, la solución estándar me falla.
¿Podría alguien ayudarme a encontrar una solución para este caso?
Editar: He decidido ir por hacer la paginación por nosotros mismos desde el conjunto de resultados distintos. La otra forma igual de malo podría haber sido a la carga perezosa los objetos B, pero que habría requerido consultas separadas para todos los objetos A a buscar correspondiente B objetos
Lo he usado también, en la subconsulta. Mi subconsulta está funcionando bien y está devolviendo identificaciones únicas. El problema es que la consulta externa está obteniendo duplicados. Por ejemplo, si la subconsulta devuelve A.ids = 1,2,3, la consulta principal (que se utiliza para la paginación), obtiene A.ids duplicados como 1,1,1,2,2,3,3,3 y, por lo tanto, la consulta completa del formulario Seleccione A. * de A en donde A.id en (subconsulta) límite 10; no puede obtener registros únicos A – Ashish
Su consulta final debe tener el siguiente aspecto: seleccione a. * desde a donde a.id in (: ids), y la consulta para obtener identificadores de A debe tener este aspecto: seleccione a.id desde A límite 10. Por lo tanto, aplique Límite solo a los identificadores, no a la consulta final. – szhem
mi consulta final es de la forma seleccione a. * Desde una combinación externa izquierda b en a.id = b.aid y esto es necesario para tener el objeto A completo. – Ashish