2012-04-02 182 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); 

我希望你能理解我的問題並抱歉我的英語不好:(

我搜索了兩天一個解決方案,我不知道如何去...

問候形成德國:) 菲利普

+0

你做什麼錯誤,特別是當使用最後的方式? – darrengorman 2012-04-02 19:55:52

+0

沒有錯誤,但返回的列表大小約爲300,並且只有一個地方,例如,「慕尼黑」地點在該列表中發生了300次。我現在知道,問題出在哪裏:我允許街道名稱是空的,因此在「慕尼黑」的每條街道上都有一個條目。 – 2012-04-02 20:25:06

回答

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

非常感謝。我之前也有過這個解決方案,但它沒有用,因爲我讓街道名稱爲空,所以在'慕尼黑'的每條街道上都有一個條目。所以這份清單中每次都是同一個地方:)我對這個愚蠢的錯誤感到羞恥:) – 2012-04-02 20:26:50