Критерии гибернации и ограничение количества строк - PullRequest
6 голосов
/ 04 июня 2010

У меня есть две сущности с именами Родитель и Дочерний , связанные между собой один-ко-многим . Дочерняя сущность имеет логическое свойство 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));

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

Ответы [ 2 ]

11 голосов
/ 29 сентября 2010

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

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

[Редактировать: исправлена ​​ошибка, указанная @brabenetz]

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

2 голосов
/ 21 мая 2013

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

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