2012-04-02 6 views
9

У меня проблема с зимним спящим режимом и критериями. У меня есть два класса:Спящий режим: Критерии с коллекциями

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

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

Я теперь хочу написать метод, который возвращает список мест, с именем, как дано в параметрах и улица, названная как дано в параметрах.

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

Я пробовал различные способы для последнего шага:

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

Другой способ:

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

последний путь:

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

Я надеюсь, что вы можете понять мою проблему и извините за мой плохой английский :(

Я искал решение в течение двух дней, и я не знаю, как идти дальше ...

приветствий образуют Германии :) Philipp

+0

Какие ошибки вы получаете, в частности, когда используя последний способ? – darrengorman

+0

Ошибка не была, но возвращаемый список имел размер около 300 и только одно место, поэтому, например, место «Мюнхен» произошло 300 раз в этом списке. Теперь я знаю, где проблема: я допустил, что название улицы пустое, поэтому для каждой улицы в «Мюнхене» была одна запись в списке. –

ответ

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

Большое вам спасибо. У меня также было это решение раньше, но это не сработало, потому что я разрешил пустое имя улицы, поэтому для каждой улицы в «Мюнхене» была одна запись в списке. Таким образом, список был полон каждого раза в одном и том же месте :) Позор мне на эту тупую ошибку :) –