2012-04-02 159 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