2012-04-02 23 views
9

Tengo un problema con la hibernación y los criterios. Tengo dos clases:Hibernate: Criterios con colecciones

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

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

ahora quiero escribir un método que devuelve una lista de lugares con un nombre como figura en los parámetros y una calle con su nombre como el dado en los parámetros.

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

He intentado diferentes maneras para que el último paso:

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

Otra forma:

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

última forma:

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

espero que puedan entender mi problema y perdón por mi mal inglés :(

he buscado una solución para dos días y no sé cómo seguir ...

Saludos :) formar Alemania Philipp

+0

Qué errores se llega, en particular cuando usando la última manera? – darrengorman

+0

No hubo ningún error, pero la lista devuelta tenía un tamaño de aproximadamente 300 y solo un lugar, por lo que, por ejemplo, el lugar "Munich" apareció 300 veces en esa lista. Ahora sé dónde estaba el problema: permití que el nombre de la calle estuviera vacío, por lo que para cada calle en "Munich" había una entrada en la lista. –

Respuesta

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

Muchas gracias. También tuve esta solución antes, pero no funcionó porque permití que el nombre de la calle estuviera vacío, por lo que para cada calle de "Munich" había una entrada en la lista. Así que la lista estaba llena de todas las veces el mismo lugar :) Lástima de mí por ese error estúpido :) –

Cuestiones relacionadas