2010-01-29 10 views
6

Ich habe eine Eins-zu-viele-Zuordnung zwischen einer übergeordneten Entität und untergeordneten Entitäten. Jetzt muss ich die Anzahl der Kinder finden, die mit jedem Elternteil für eine Liste der Eltern verbunden sind. Ich versuche, dies mit HQL zu tun, aber ich bin mir nicht sicher, wie ich die Liste der Eltern dort bekommen kann. Außerdem weiß ich nicht, wie ich die Entität selbst und nicht nur ihre ID zurückgeben kann. Meine aktuelle HQL-Abfrage lautet:Holen Sie Kinder zählen über HQL

aber dies gibt nur die ID zurück und filtert nicht nach bestimmten Eltern.

EDIT Basierend auf Pascal Antwort habe ich die Abfrage

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

das funktioniert, ist aber untragbar langsam: 30 Sekunden statt 400 ms auf der gleichen Datenbank.

+0

der Tat, das ist schrecklich langsam. Kaum annehmbar eigentlich ... –

+0

Indizes können (Schwerpunkt auf Mai) mit der Geschwindigkeit helfen, aber die andere Möglichkeit ist, die HQL-Abfrage in Teile zu brechen, wenn Sie können - ich habe gefunden, dass manchmal zu helfen. Oder Sie können Abfragen für jedes Elternelement durchführen und die Karte selbst erstellen. Ein guter Datenbank-Profiler wird wahrscheinlich bei der Exploration helfen. – aperkins

+0

Die Lösung, die ich am Ende gewählt habe, besteht darin, zuerst alle Eltern aus der Datenbank zu holen, dann die Abfrage auszuführen, die mir Eltern-IDs und Zählungen gibt, und dann die beiden in Java zusammenzuführen. Ich muss sowieso alle Eltern bekommen, und das Zusammenführen dieser Liste mit der Kinderzählung dauert weniger als eine Sekunde, was in dieser Situation in Ordnung ist. –

Antwort

4

Ich bin nicht 100% sicher, dass aber was ist das:

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

Funktioniert nicht, bekomme ich eine SQL-Ausnahme, weil die generierten SQL-Gruppen von parent.id aber auch viele andere Spalten. –

+0

@Thomas Ach ja, tatsächlich habe ich meine Antwort entsprechend aktualisiert –

0

Danke. Ich suchte nach der Anzahl der Kinder für einen bestimmten Elternteil und Ihre Beiträge brachten mich in die richtige Richtung.

Falls jemand anderes muss die Zahl der Kinder für einen bestimmten Eltern finden, könnten Sie so etwas wie folgt verwenden:

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()); 
Verwandte Themen