2012-04-02 18 views
9

Ho un problema con l'ibernazione e i criteri. Ho due Classi:Ibernazione: criteri con le raccolte

public class Place{ 
    long id; 
    String name; 
    Set<Street> streets; 
} 

public class Street{ 
    long id; 
    String name; 
    Place place; 
} 

Ora voglio scrivere un metodo che restituisce un elenco di luoghi con un nome come dato nei parametri e una strada chiamata come dato in parametri.

public List<Place> findPlaces(String name, String streetname){ 
    //getSession() gives me a hibernate session 
    Criteria crit = getSession().createCriteria(Place.class, "place"); 
    crit.add(Restrictions.like("name", name+"%")); 
    //Everything works fine until here 
    //Last step: Sort out all places not containing a street named like streetname + "%" 
} 

ho cercato diversi modi per l'ultimo passaggio:

//streetList is a list of all streets named like streetname 
crit.add(Restrictions.in("streets", streetList)); 

Un altro modo:

DetachedCriteria strasseCrit = DetachedCriteria.forClass(Street.class, "street"); 
streetCrit.add(Restrictions.like("street.name", streetname + "%")); 
streetCrit.createAlias("street.place", "streetPlace"); 
streetCrit.add(Restrictions.eqProperty("streetPlace.id", "place.id")); 
streetCrit.setProjection(Projections.property("street.name")); 
crit.add(Subqueries.exists(streetCrit)); 

ultimo modo:

crit.createAlias("place.streets", "street"); 
crit.add(Restrictions.like("street.name", streetname + "%")); 
crit.setResultTransformer(DistinctResultTransformer.INSTANCE); 

Spero che tu possa capire il mio problema e mi dispiace per il mio cattivo inglese :(

ho cercato una soluzione per due giorni e non so come andare avanti ...

Saluti formare Germania :) Philipp

+0

Quali errori non si ottiene, in particolare quando usando l'ultimo modo? – darrengorman

+0

Non si sono verificati errori, ma l'elenco restituito aveva una dimensione di circa 300 e un solo posto, quindi ad esempio il posto "Monaco" si è verificato 300 volte in quella lista. Ora so, dove il problema era: ho permesso che lo streetname fosse vuoto, quindi per ogni strada di "Munich" c'era una voce nella lista. –

risposta

13
public List<Place> findPlaces(String name, String streetname){ 
    Criteria crit = getSession().createCriteria(Place.class, "place"); 
    criteria.createAlias("streets", "s"); // Create alias for streets 
    crit.add(Restrictions.like("s.name", name+"%")); 
    // continue method 
} 
+2

Grazie mille. Avevo anche questa soluzione, ma non funzionava perché permettevo che lo streetname fosse vuoto, quindi per ogni strada di "Munich" c'era una voce nell'elenco. Quindi la lista era piena di ogni volta nello stesso posto :) Vergognatevi per quello stupido errore :) –

Problemi correlati