Получить счет детей через HQL - PullRequest
6 голосов
/ 29 января 2010

У меня есть сопоставление «один ко многим» между родительским объектом и дочерним объектом. Теперь мне нужно найти количество детей, связанных с каждым родителем, для списка родителей. Я пытаюсь сделать это с HQL, но я не уверен, как я могу получить список родителей там. Кроме того, я не знаю, как я могу вернуть сам объект, а не только его идентификатор. Мой текущий HQL-запрос:

select new map(parent.id as parentId, count(*) as childCount) 
from Parent parent left join parent.children children
group by parent.id

но это только возвращает идентификатор и не фильтрует определенных родителей.

EDIT Основываясь на ответе Паскаля, я изменил запрос на

select new map(parent as parent, count(elements(parent.children)) as childCount) 
from Parent parent
group by parent

Это работает, но запредельно медленно: 30 секунд вместо 400 мс в той же базе данных.

Ответы [ 2 ]

4 голосов
/ 29 января 2010

Я не уверен на 100%, но что на счет этого:

select new map(parent.id, count(elements(parent.children)))
from Parent parent group by parent.id
0 голосов
/ 17 февраля 2011

Спасибо. Я искал количество детей для конкретного родителя, и ваши посты заставили меня двигаться в правильном направлении.

Если кому-то еще нужно найти количество детей для конкретного родителя, вы можете использовать что-то вроде этого:

Query query = this.sessionFactory.getCurrentSession().createQuery("select count(elements(parent.children)) from Parent parent where name = :name");
query.setString("name", parentName);
System.out.println("count = " + query.uniqueResult());
...