2009-03-24 7 views
1

Je suis en train de migrer une ancienne application "ASP classique" vers J2EE/Hibernate. J'ai un problème avec le type suivant des instructions SQL:Regroupement en mode hibernation

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 

Comment puis-je exprimer quelque chose comme ça dans HQL? J'ai essayé de mapper les enfants en tant que collection (en utilisant plusieurs-à-un) et obtenir le nombre d'enfants de la taille de la collection, mais Hibernate doit charger toutes les entités "enfants", pour chaque parent séparément.

Cela entraîne l'exécution de 1000 requêtes DB au lieu de 1, avec tous les problèmes de performances qui en résultent.

Y a-t-il un moyen de contourner ce problème?

Répondre

0

Traduction à HQL

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

où Parent est une entité préalablement modélisé. La clause de jointure est définie dans le modèle. Pour obtenir le nombre d'enfants, séparément pour chaque parent, essayez de supprimer tous les champs Lob du modèle enfant, car ils gèleront la vitesse de votre application.

l'espoir d'avoir aidé

1

Je voudrais essayer quelque chose comme ce qui suit:

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

Je ne suis pas tout à fait sûr, mais je pense que la jointure pourrait/devrait être explicitement écrit: « left join fetch parent.Children "afin de dire à Hibernate de précharger la collection via rejoindre. – LorenzCK