2010-06-04 20 views
5

tengo dos entidades nombradas Padres y Niño, vinculados en una relación uno-a-muchos. La entidad Child tiene una propiedad booleana isStudent.Hibernate Criterios y recuento de filas restricción

¿Cómo obtengo, utilizando la API de criterios de Hibernate, todas las entidades principales que tienen al menos un elemento secundario con isStudent = true?

Estaba intentando usar un objeto de proyección para contar todos los padres que tienen al menos un hijo con la propiedad establecida correctamente, y luego devolver aquellos cuyo número de filas es mayor que cero, como en el siguiente fragmento de código (que no funciona, sin embargo):

Criteria criteria = getCurrentSession().createCriteria(Parent.class); 

criteria.setProjection(Projections.alias(Projections.rowCount(), "count")) 
.add(Restrictions.gt("count", 0)).createCriteria("children") 
.add(Restrictions.eq("isStudent", true)); 

Gracias por su ayuda

Respuesta

9

Esto funcionó para mí:

DetachedCriteria crit   = DetachedCriteria.forClass(Parent.class, "theparent"); 
DetachedCriteria countSubquery = DetachedCriteria.forClass(Child.class , "child" ); 

countSubquery 
    .add(Property.forName("theparent.id").eqProperty("parent.id")) 
    .setProjection(Projections.count("id")); 

crit.add(Subqueries.lt(Long.valueOf(0), countSubquery)); 

[Editar: corregido un error de un señalados por @brabene tz]

Donde hay una relación bidireccional entre padre e hijo, es decir, el hijo tiene un campo "primario" Devuelve los padres que tienen> 0 hijos.

1

La respuesta de RobAu es casi lo que necesitábamos. Pero hay un pequeño error: en lugar de Subconsultas. gt (..) necesita Subconsultas. lt (...)

crit.add(Subqueries.lt(Long.valueOf(0), countSubquery)); 
+0

siente hacia atrás, pero funciona! –

Cuestiones relacionadas