2010-05-21 14 views
7

Esta pregunta es muy similar a this one pero las respuestas fueron mínimas a esa pregunta.Pregunta de criterios de Hibernate para hacer coincidir con todos los elementos de la colección hija

Tengo una clase para padres con un conjunto de entidades secundarias. Las entidades secundarias son solo un contenedor de una cadena y viven en una tabla diferente a la entidad principal. Deseo tener una consulta de criterio que devuelva las entidades padre cuando todos los miembros del conjunto de entidades hijo devuelvan verdadero a una condición. Esta condición se corresponde con una de una lista de cadenas. Aquí es donde estoy:

Criteria c = criteria(); 
Criteria ands = c.createCriteria("ands"); 
Disjunction dis = Restrictions.disjunction(); 
for (String value : values) { 
    dis.add(Restrictions.like("value", "%" + value + "%")); 
} 
ands.add(dis); 
return list(c); 

"ands" es el conjunto de entidades con un campo "valor" que es una cadena. "criteria()" crea un criterio para la clase padre. "list()" simplemente llama a criterios.list();

Esto es solo coincidencia con cualquiera de los elementos, en lugar de todos.

Espero que esto tenga sentido. Cualquier ayuda muy apreciada.

Respuesta

0

¿No debería esa disyunción ser una conjunción?

+0

Hola, Tiene que ser una disyunción porque quiero seleccionar la matriz donde cada elemento de la colección es como cualquiera string a, o string b, o string c. etc. –

3

Como un ejercicio teórico, se puede hacer algo como esto:

Criterion condition = ...; 

Criteria c = s.createCriteria(Parent.class, "p"); 
DetachedCriteria dc = DetachedCriteria.forClass(Parent.class, "p2") 
    .createCriteria("ands", "c") 
    .add(Restrictions.not(condition)) 
    .add(Property.forName("p.id").eqProperty("p2.id")) 
    .setProjection(Projections.id()); 

c.add(Subqueries.notExists(dc)); 

Sin embargo, este enfoque no es bueno para el uso práctico, ya que requiere de más join (debido a la ausencia de in elements cláusula en la API Criteria). También tenga en cuenta que utiliza doble negación (SELECT ... WHERE NOT EXISTS (SELECT ... WHERE NOT <condition>)), por lo que puede tener problemas con NULL s.

EDIT: En HQL que se puede escribir así:

from Parent p 
where not exists (select c from p.ands c where not <condition>) 

o

from Parent p 
where not exists (select c from Child c 
    where not <condition> and c in elements(p.ands)) 

Pero, por lo que yo entiendo, ambas consultas no puede expresarse en los criterios del API (No puede escribir from p.ands en la subconsulta y no puede usar in elements). Así, en la API Criterios usted tiene que utilizar adicional unirse (Nota 2 Parent s):

from Parent p 
where not exists (select c from Parent p2 join p2.ands c 
    where not <condition> and p = p2) 
+0

gracias por esto. Solo explorando sus posibilidades. Quizás HQL sería mejor aquí, pero estoy teniendo problemas para entender la cláusula elements(). ¿Podría usar todos los elementos (parent.ands) de alguna manera quizás? –

+0

@Andrew: Editado – axtavt

+0

ah - genial. Esto funciona como se esperaba Muchas gracias. Solo estoy preocupado por el rendimiento ahora. –

Cuestiones relacionadas