2010-06-04 5 views
5

у меня есть две сущности, названные Родитель и Ребенок, связанных в отношениях с один-ко-многим. У дочернего объекта есть свойство boolean isStudent.спящий режим Критерии и количество строк ограничение

Как получить, используя API-интерфейс Hibernate Criteria, все родительские объекты, у которых есть хотя бы один ребенок с isStudent = true?

Я пытался использовать объект Projection для подсчета всех родителей, у которых есть хотя бы один Ребенок с правильно установленным свойством, а затем вернуть те, число строк которых больше нуля, как в следующем фрагменте кода (который не работает, хотя):

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

Спасибо за вашу помощь

ответ

9

Это работает для меня:

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

[Edit: исправлена ​​ошибка заостренным путем @brabene tz]

Если существует двунаправленная связь между родителем и ребенком, то есть у ребенка есть поле «родитель» Возвращает родительские имена, имеющие> 0 детей.

1

Ответ от RobAu - это то, что нам нужно. Но в нем есть небольшая ошибка: вместо подзапросов. gt (..) вам нужны подзапросы. л (...)

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

чувствует назад, но это работает! –

Смежные вопросы