¿Sabe usted de todos modos para obtener un resultado distinto sin el uso de la ResultTransformer cuando se utiliza SetFirstResult y SetMaxResults?

StackOverflow https://stackoverflow.com/questions/545940

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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top