¿Sabe usted de todos modos para obtener un resultado distinto sin el uso de la ResultTransformer cuando se utiliza SetFirstResult y SetMaxResults?
-
23-08-2019 - |
Pregunta
Cuando yo uso SetFirstResult y SetMaxResult y si la consulta se une el resultado han duplicado los resultados en lugar de único.
Entonces yo uso de todo tipo de los Distintos ayudantes para los criterios de la api.Pero no filtrar el conjunto de resultados completo sólo los filtros de la página de resultados.
¿Cómo puedo superar este problema ?
Gracias
Solución
He encontrado un cosa hacky para superar este problema .
La única "solución" que para este He sido capaz de llegar a es emitir dos consultas de los criterios mismos criterios objeto. El primero obtiene el ID es el segundo es contrained a los identificadores.
// configurar crtieria como desee, incluyendo paginación myCriteria = doStuffToSetupCriteria (); myCriteria.setFirstResult ((página-1) * itemsPerPage); myCriteria.setMaxResults (itemsPerPage);
// obtener la lista si las claves primarias myCriteria.setProjection (Projections.distinct (Projections.property ( "myAllias.id")); Lista ids = gacc.list ();
// añadir ahora el ID de en el restricción myCriteria.add (Restrictions.in ( "myAlias.id, ids));
// limpiar desde la última ejecución critiera gacc.setProjection (null); gacc.setFirstResult (0); gacc.setMaxResults (Integer.MAX_VALUE);
// lista de resultados de objetos = gacc.list ()
Un poco hacky Estoy de acuerdo, pero el único Soltion aceptable dado que pude encontrar este limitiation.
Otros consejos
He construido una solución similar pero en un solo viaje a la DB:
DetachedCriteria subconsulta = ...//-->Agregar todos los Criterios que desea e incluyente "SetFirstResult" y "SetMaxResults"
DetachedCriteria rootQuery = DetachedCriteria.Para();// donde T es una entidad
subconsulta.A setprojection( Las proyecciones.Distintos( Las proyecciones.ProjectionList().Agregar(Proyecciones.Alias(Proyecciones.De la propiedad("ID"), "ID")) ) );
// Nota:todos mis entidades heredar de una clase base que contiene una propiedad "ID" rootQuery.Agregar(Subconsultas.PropertyIn("ID", subconsulta));
// ...a continuación, utilizar rootQuery para obtener la Lista de T y de no repetición del elemento va a ser recuperada.
Espero que alguien encuentre esta aplicación útil :)
Román