2011-01-10 25 views
6

Estoy escribiendo una consulta muy simple, pero obtengo valores duplicados por algún motivo.Hibernate, obteniendo valores duplicados

Criteria cr = session.createCriteria(ProcessInstance.class, "p") 
     .add(Restrictions.isNull("end")); 
@Cleanup ScrollableResults sr = cr.scroll(ScrollMode.FORWARD_ONLY); 

while (sr.next()) { 
    pi = (ProcessInstance) sr.get(0); 
    String id = pi.getId(); //Getting duplicate values 
} 

pi.getId() devuelve valores duplicados. es decir: *9,9,10,10,11,11 etc*

Sin embargo, ejecutar esta consulta directamente en MySQL

SELECT * FROM JBPM_PROCESSINSTANCE J where J.END_ IS NULL 

no devuelve valores duplicados.

¿Alguien puede detectar lo que está mal?

+0

sin su asignación es difícil de decir. – Matt

Respuesta

17

El workarround rápido sería usar un Transformador de resultados de entidad de raíz distinta.

... 
crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
List unique = crit.List(); 
... 

Pero esto es solo un workarround.

I ques el problema pertenece a su mapeo. Si hay alguna relación 1: n cargada ansiosa desde ProcessInstance a otra cosa (llámela X), y hay varias (n) X para una ProcessInstance, obtendrá varios elementos de ProcessInstance (n) en la lista de resultados para un único ProcessInstance. - Si esta es realmente la causa, que el workarround no es solo un workarround, entonces sería la solución.

+0

Sí, esto es correcto. Cambiamos el mapeo para obtener ansias. Gracias –

+0

Esto no ayudó. Aún recibimos duplicados. ¿El ResultTransformer solo funciona con List()? Estamos usando scroll. –

+0

Me entiendes mal: el problema puede ocurrir si la relación ES buscada egger - cámbialo a perezoso. – Ralph

2

I encouter el mismo problema que tú ..

Así es como lo resuelvo.

Criteria cr = session.createCriteria(ProcessInstance.class, "p") 
     .add(Restrictions.isNull("end")).setProjection("id") 

esto devolverá todos los ID que satisfagan todos sus criterios.

allí después de usar In restricciones y realizar CriteriaSpecification.DISTINCT_ROOT_ENTITY.

Podrá desplazar su resultado en segundos criterios. Espero que esta ayuda.

Cuestiones relacionadas