2015-09-28 3 views
-1

У меня есть следующий запрос HQL:Подсчитайте количество групп в запросе HQL?

select c.device from Choice c 
group by c.device 

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

Я пробовал:

select count(distinct c.device) from Choice c 
    group by c.device 

, но это дает число различных устройств в каждой группе. Это что-то вроде [2,3,4]. Но мне нужно 2+3+4.

Как получить количество групп с помощью HQL?

+0

Похоже, что [sum] (http://docs.jboss.org/hibernate/orm/5.0/userGuide/en-US/html_single/#d5e2074) может делать то, что вы хотите? – doelleri

+1

Кроме того, вам нужно количество групп, которое на основе вашего образца будет '3', или вам нужна сумма всех групп, которая будет' 9'? – doelleri

+0

Нет, окончательно это не сумма. – confile

ответ

2

Вам нужно будет сделать счетчик, который не поддерживается в HQL.

SQL

В SQL это будет выглядеть примерно так:

select count(innerQuery.counted) 
from (select count(d.id) as counted 
     from Choice c inner join Device d 
     on c.device_id = d.id 
     group by d.id) as innerQuery 

В приведенном выше примере внешний запрос выбирает из суб-запроса, который возвращает группы. Внешний запрос затем подсчитывает на сгенерированном столбце counted.

HQL

Альтернативой сделать подсчет, а затем получить размер списка.

Choice.executeQuery('select count(c.device) from Choice c group by c.device').size() 

Существует штраф за исполнение, поскольку подсчет производится на стороне клиента.

+0

Я думаю, вместо '' .size() '' вы должны делать '.sum()' '? – confile

+3

'size()' даст вам _ количество групп_, потому что каждая запись представляет собой одну группу. 'sum()' даст вам общее количество устройств. Например, 'assert [2,3,4] .size() == 3' и' assert [2,3,4] .sum() == 9' –

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