2012-05-17 11 views
7

Ho due entità, persona e attività. L'attività ha lo status di proprietà e l'entità Persona contiene la raccolta di attività. Mi piacerebbe avere una lista di persone che hanno tutte le attività con stato 'Fatto'.Hibernate controlla tutti gli elementi uguali nella collezione

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

Ma questo restituisce tutto oggetto con almeno un'attività con stato eseguito. Vorrei recuperare l'elenco delle persone con stato di tutte le attività impostato su Fatto. Qualcuno può aiutarmi?

risposta

0

Pensa di negarlo. Recupera quelli le cui attività hanno e nessuno è in stato diverso da Done. Quindi puoi semplicemente aggiungere maxResults() o list.get(0) (Ricorda che potrebbe non contenere nessuna 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 

Questo dovrebbe fare il trucco. Nota che se hai un carico pigro, potresti dover aggiungere la parola chiave "fetch" nella tua query Hibernate. Ecco un link utile per unisce: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-joins

0

Ecco come si può fare con Criteri:

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); 

Kinda tardi, ma spero di poter aiutare qualcuno che lotta ancora con questo come ho fatto .

Problemi correlati