Подсчет количества объектов, соответствующих определенным критериям - PullRequest
3 голосов
/ 30 декабря 2010

Название не рассказывает полную историю.Пожалуйста, прочитайте сообщение.

У меня есть два объекта: взрослый и ребенок.Child имеет логическое поле isMale и ссылку на Adult.Взрослый не ссылается на Ребенка.

public class Adult {
   long id;
}
public class Child {
   long id;
   boolean isMale;
   Adult parent;
}

Я хочу создать запрос, чтобы указать количество сыновей у каждого взрослого, включая взрослых, у которых нет сыновей.Я попытался:

Запрос 1

SELECT adult, COUNT(child) FROM Child child 
RIGHT OUTER JOIN child.parent as adult 
WHERE child.isMale='true' 
GROUP BY adult

, что означает sql

select
    adult.id as col_0_0_,
    count(child.id) as col_1_0_,
    ... {omit properties}
from
    Child child
right outer join
    Adult adult
        on child.parentId=adult.id 
where
    child.isMale = 'true'
group by
    adult.id

Запрос 1 не собирает взрослых, у которых нет сыновей.1014 *

Запрос 2:

SELECT adult, COUNT(child.isMale) FROM Child child 
RIGHT OUTER JOIN child.parent as adult 
GROUP BY adult

переводится в sql:

select
    adult.id as col_0_0_,
    count(child.id) as col_1_0_,
    ... {omit properties}
from
    Child child
right outer join
    Adult adult
        on child.parentId=adult.id 
group by
    adult.id

Запрос 2 не имеет правильного количества сыновей.В основном COUNT не оценивает isMale.
Предложение where в запросе 1 отфильтровывает взрослых без сыновей.

Как построить запрос HQL или Criteria для этого варианта использования?

Спасибо.

1 Ответ

1 голос
/ 30 декабря 2010

Условие child.isMale='true' ложно для взрослых без детей (isMale равно NULL), поэтому вам следует рассмотреть этот случай:

SELECT adult, COUNT(child) 
FROM Child child RIGHT OUTER JOIN child.parent as adult 
WHERE child IS NULL OR child.isMale='true'  
GROUP BY adult
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...