2012-05-17 22 views
7

Tengo dos entidades, es decir, Persona y Actividad. La actividad tiene estado de propiedad y la entidad Persona contiene una colección de actividades. Me gustaría obtener una lista de personas que tienen todas las actividades con el estado 'Hecho'.Hibernate verificando todos los elementos iguales en la colección

Criteria crit = s.createCriteria(Person.class); 
    crit.createAlias("activities", "act").add(Restrictions.eq("act.status","Done")); 

Pero esto devuelve todos los objetos con al menos una actividad con estado realizado. Me gustaría recuperar la lista de personas con todos los estados de actividades establecidos en Listo. ¿Alguien puede ayudarme?

Respuesta

0

Piense en negarlo. Recupere aquellos cuyas actividades tienen y ninguna está en un estado diferente de Done. Luego, simplemente puede agregar maxResults() o list.get(0) (Tenga en cuenta que podría no contener a ninguna persona).

1
// open hibernate session 
Query query = session.createQuery("Select p from Persons p inner join p.activities a where a.status = :code"); 
query.setParameter("code", "Done"); 
List results = query.list(); 

// close session 

for (int i = 0; i < results.size();){ 
    Person person = results.get(i); 
    List<Activity> activities = person.getActivities(); 
    for (int j = 0; j < activities.size(); j++){ 
    if (!activities.code.equals("Done")){ 
     results.remove(i); 
     break; 
    } // end if 
    } // end for j 
    i++; 
} // end for i 

Esto debería hacer el truco. Tenga en cuenta que si tiene una carga lenta, es posible que necesite agregar la palabra clave "fetch" en su consulta de Hibernate. Aquí hay un enlace útil para las uniones: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-joins

0

aquí es cómo puede hacerlo con Criterios:

Criteria crit = s.createCriteria(Person.class); 

DetachedCriteria sub = DetachedCriteria.forClass(Person.class); 
sub.createAlias("activities","act"); 
sub.add(Restrictions.ne("act.status","Done")); 
sub.setProjection(Projections.property("id"); 

crit.add(Property.forName("id").notIn(sub); 

Un poco tarde, pero espero que pueda ayudar a alguien que todavía lucha con esto como lo hice .

Cuestiones relacionadas