2010-01-29 7 views
6

J'ai un mappage un-à-plusieurs entre une entité parente et des entités enfants. Maintenant, j'ai besoin de trouver le nombre d'enfants associés à chaque parent pour une liste de parents. J'essaie de le faire avec HQL mais je ne suis pas sûr de savoir comment je pourrais obtenir la liste des parents. En outre, je ne sais pas comment je peux retourner l'entité elle-même et pas seulement son identité. Ma requête HQL actuelle est:Obtenir le comptage des enfants via HQL

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

mais cela ne renvoie que l'ID et ne filtre pas sur des parents spécifiques.

EDIT Sur la base de la réponse de Pascal J'ai modifié la requête

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

qui fonctionne, mais il est extrêmement lents: 30 secondes au lieu de 400 ms sur la même base de données.

+0

En effet, c'est horriblement lent. Difficilement acceptable en réalité ... –

+0

Les index peuvent (en accent sur mai) aider à la vitesse, mais l'autre option est de diviser la requête hql en plusieurs parties si vous le pouvez - j'ai trouvé cela utile parfois. Ou vous pouvez faire des requêtes séparées pour chaque élément parent et créer la carte vous-même. Un bon profileur de base de données aidera probablement à l'exploration. – aperkins

+0

La solution que j'ai choisie à la fin est d'abord récupérer tous les parents de la base de données, puis exécutez la requête qui me donne les ID et les comptes parents, puis fusionner les deux en Java. Je dois quand même avoir tous les parents, et fusionner cette liste avec le nombre d'enfants prend moins d'une seconde, ce qui est correct dans cette situation. –

Répondre

4

Je ne suis pas sûr à 100% que mais qu'en ceci:

select new map(parent.id, count(elements(parent.children))) 
from Parent parent group by parent.id 
+0

Ne fonctionne pas, j'obtiens une exception SQL en faisant cela parce que les groupes SQL générés par parent.id mais sélectionne beaucoup d'autres colonnes aussi bien. –

+0

@Thomas Ah oui, en effet, j'ai mis à jour ma réponse en conséquence –

0

Merci. Je cherchais le nombre d'enfants pour un parent particulier et vos messages m'ont amené dans la bonne direction.

Au cas où quelqu'un d'autre a besoin de trouver le nombre d'enfants pour un parent particulier, vous pouvez utiliser quelque chose comme ceci:

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()); 
Questions connexes