2009-10-06 29 views
16

Supongamos que tengo clases como:Hibernate criterios de consulta en diferentes propiedades de diferentes objetos

class A { 
B getB(); 
C getC(); 
} 

class B { 
String getFoo(); 
} 

class C { 
int getBar(); 
} 

y quiero filtrar criterios en una, dos filtros en diferentes propiedades de las subclases, como:

Criteria criteriaA = session.createCriteria(A.class); 
Criteria criteriaB = criteriaA.createCriteria("b").add(Restrictions.eq("foo", "Something")); 
Criteria criteriaC = criteriaA.createCriteria("c").add(Restrictions.eq("bar", 0)); 

Lo que quiero hacer es combinar los criterios B y los criterios C usando una cláusula "o", algo así como:

//this does not work 
criteriaA.add(Restrictions.disjunction().add(criteriaB).add(criteriaC)); 

¿Cómo puedo lograr esto? Estoy tropezando un poco con el API aquí.

Respuesta

24

Uso aliases en lugar de criterios anidados:

Criteria criteria = session.createCriteria(A.class) 
.createAlias("b", "b_alias") 
.createAlias("c", "c_alias") 
.add(Restrictions.disjunction() 
    .add(Restrictions.eq("b_alias.foo", "Something")) 
    .add(Restrictions.eq("c_alias.bar", "0")) 
); 
+0

Los alias son innecesarios. –

+0

Probando esto - gracias de nuevo, Chess – RMorrisey

+0

¿Cómo harías esto sin los alias? – RMorrisey

4

Sólo se necesita para crear un criterio de objeto como tal.

Criteria criteria = session.createCriteria(A.class); 
criteria.add(Restriction.disjunction() 
    .add(Restriction.eq("b.foo", "something")) 
    .add(Restriction.eq("c.bar", 0))); 
+0

Esto no funciona; Me sale un error como: org.hibernate.QueryException: could not resolve property: b.foo of: com.myproject.A – RMorrisey

+0

Parece que esto funcionaría con un solo nivel de propiedades, pero no para el filtro real que estoy usando . – RMorrisey

+0

Tienes que usar createAlias ​​of createQuery. Edité la respuesta en consecuencia. –

3

En caso de que alguien le resulta útil, he encontrado una respuesta más compleja al problema que parece estar permitido por la API, aunque no llegué a probarlo antes de ChssPly publicó su solución (simple):

DetachedCriteria bValues = DetachedCriteria.forClass(A.class); 
bValues.createCriteria("b").add(Restrictions.eq("foo", "something")); 

DetachedCriteria cValues = DetachedCriteria.forClass(A.class); 
cValues.createCriteria("c").add(Restrictions.eq("bar", 0)); 

Restrictions.or(Subqueries.in("id", bValues), Subqueries.in("id", cValues)); 
+0

Interesante, nunca pensé que lo intentaría de esta manera. La consulta resultante sería bastante diferente (y, posiblemente, más lenta) de la obtenida a través de alias. Pero esta puede ser la manera de resolver su problema sqlRestriction si los alias fallan. – ChssPly76

Cuestiones relacionadas