2009-03-24 6 views
1

Я в процессе миграции старого приложения «классического ASP» в J2EE/Hibernate. У меня есть проблема со следующим типом операторов SQL:Группировка в спящем режиме

SELECT parent.id, parent.name, parent.column1, count(child.id) AS no_of_children 
FROM parent 
INNER JOIN child ON child.parent_id = parent.id 
GROUP BY parent.id, parent.name, parent.column1 

Как я выразить что-то подобное в HQL? Я попытался сопоставить детей как коллекцию (используя много-к-одному) и получить количество детей из размера коллекции, но затем Hibernate должен загрузить все «дочерние» сущности для каждого родителя отдельно.

Это приводит к выполнению около 1000 запросов БД вместо 1, со всеми возникающими проблемами с производительностью.

Есть ли способ обойти это?

ответ

0

Перевод на HQL

FROM Parent GROUP BY Parent.id, Parent.name, Parent.column1 

где Родитель является Entity ранее смоделированы. Предложение предложения определено в модели.

Что касается получения количества детей, для каждого родителя отдельно, попробуйте удалить любые поля Lob в модели Child, поскольку они будут препятствовать скорости вашего приложения.

Надежда помогли

1

Я хотел бы попробовать что-то вроде следующего:

select parent.id, parent.name, parent.column1, count(child) 
from Parent parent 
join parent.Children as child 
group by parent.id, parent.name, parent.column1 
+0

Я не совсем уверен, но я думаю, что присоединиться может/должно быть явно написано, как: «левое соединение выборки parent.Children ", чтобы сообщить Hibernate предварительно загрузить сборку через соединение. – LorenzCK