2012-04-02 18 views
9

Ich habe ein Problem mit Ruhezustand und Kriterien. Ich habe zwei Klassen:Hibernate: Kriterien mit Sammlungen

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

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

Ich möchte nun ein Verfahren schreiben, die eine Liste von Orten mit einem Namen wie in den Parametern angegeben zurückgibt und eine Straße benannt wie in Parameter.

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 + "%" 
} 

Ich habe versucht, verschiedene Möglichkeiten für den letzten Schritt:

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

andere Art und Weise:

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

letzte Weg:

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

Ich hoffe, dass Sie mein Problem verstehen können und sorry für mein schlechtes Englisch :(

ich für eine Lösung für zwei Tage gesucht und ich weiß nicht, wie es weitergehen ...

Grüße Philipp :) Deutschland bilden

+0

Welche Fehler haben Sie bekommen, insbesondere wenn den letzten Weg benutzen? – darrengorman

+0

Es gab keinen Fehler, aber die zurückgegebene Liste hatte eine Größe von etwa 300 und nur einen Ort, so zum Beispiel der Ort 'München' 300 Mal in dieser Liste aufgetreten. Ich weiß jetzt, wo das Problem lag: Ich ließ den Straßennamen leer sein, also gab es für jede Straße in München einen Eintrag in der Liste. –

Antwort

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

Vielen Dank. Ich hatte auch diese Lösung vorher, aber es hat nicht funktioniert, weil ich den Straßennamen leer gelassen habe, also gab es für jede Straße in München einen Eintrag in der Liste. Also die Liste war jedesmal am selben Ort voll :) Schäm mich bei diesem dummen Fehler :) –