2012-04-02 12 views
9

Mam problem ze stanem hibernacji i kryteriami. Mam dwie klasy:Hibernate: Kryteria ze zbiorami

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

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

teraz chcę napisać metodę, która zwraca listę miejsc z nazwą jak podano w parametrach i ulica nazwana jak podano w parametrach.

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

Próbowałem różnych sposobów, za ostatni krok:

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

inny sposób:

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

ostatni sposób:

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

Mam nadzieję, że można zrozumieć mój problem i przepraszam za mój zły angielski :(

Szukałem rozwiązania dla dwóch dni i nie wiem, jak przejść na ...

Pozdrowienia z Niemiec :) Philipp

+0

Co zrobić masz błędy, zwłaszcza gdy używając ostatniego sposobu? – darrengorman

+0

Nie było błędu, ale zwrócona lista miała rozmiar około 300 i tylko jedno miejsce, więc na przykład miejsce "Monachium" pojawiło się 300 razy na tej liście. Teraz wiem, gdzie jest problem: pozwoliłem, by nazwa ulicy była pusta, więc na każdej ulicy w "Monachium" był jeden wpis na liście. –

Odpowiedz

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

Dziękuję bardzo. Miałem też to rozwiązanie wcześniej, ale nie działało, ponieważ pozwalałem, aby nazwa ulicy była pusta, więc na każdej ulicy w "Monachium" był jeden wpis na liście. Tak więc lista była pełna za każdym razem w tym samym miejscu :) Wstyd mi za ten głupi błąd :) –

Powiązane problemy