Оператор CASE в HQL или Критерии - PullRequest
6 голосов
/ 15 августа 2011

получено из этого вопроса , возможно ли использовать HQL или критерии для следующего оператора SQL:

SELECT 
   e.type, 
   count(e), 
   count(d), 
   count (case when gender = 'male' then 1 else NULL end) AS NumberOfMaleEmployees
from Department d 
JOIN d.employees e
WHERE e.dead = 'maybe' 
GROUP BY e.type

Несмотря на то, что Google предлагает несколько совпадений, в которых говорится, что HQL поддерживает операторы CASE, Hibernate 3.6.6 завершается с ошибкой

QuerySyntaxException: неожиданный токен: CASE

при создании запроса выше для экземпляра EntityManager.

Насколько плоха идея создать еще один запрос для каждого типа e.type, чтобы вручную определить количество мужчин, например, за каждый e.type

SELECT 
   count(e), 
from Department d 
JOIN d.employees e
WHERE e.dead = 'maybe', e.type = ugly

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

1 Ответ

11 голосов
/ 19 августа 2011

Что ж, похоже, поддерживаются операторы case:

http://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html

Они просто не работают в count ()В качестве альтернативы можно использовать сумму (случай, когда ... затем 1 или 0 конец) вместо

...