2010-01-29 20 views
6

Ho una mappatura uno-a-molti tra un'entità padre e entità figlio. Ora ho bisogno di trovare il numero di bambini associati a ciascun genitore per un elenco di genitori. Sto cercando di farlo con HQL, ma non sono sicuro di come sia possibile ottenere l'elenco dei genitori. Inoltre, non so come posso restituire l'entità stessa e non solo il suo ID. La mia query HQL corrente è:Ottenere i conteggi dei figli tramite HQL

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

ma questo restituisce solo l'ID e non filtra su genitori specifici.

EDIT in base alla risposta di Pascal ho modificato la query per

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

che fa il lavoro, ma è proibitivo lenta: 30 secondi invece di 400 ms sulla stessa base di dati.

+0

In effetti, questo è terribilmente lento. Difficilmente accettabile in realtà ... –

+0

Gli indici possono (enfatizza maggio) aiutare con la velocità, ma l'altra opzione è quella di scomporre la query hql in parti se è possibile - ho trovato che a volte aiutare. O potresti fare query separate per ogni elemento genitore e creare la mappa da solo. Un buon profiler del database probabilmente aiuterà con l'esplorazione. – aperkins

+0

La soluzione che ho scelto alla fine è quella di recuperare prima tutti i genitori dal database, quindi eseguire la query che mi dà ID padre e conteggi e quindi unire i due in Java. Devo comunque avere tutti i genitori e unire quella lista con il numero dei bambini richiede meno di un secondo, il che va bene in questa situazione. –

risposta

4

non sono sicuro al 100% che, ma che dire di questo:

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

Non funziona, ottengo un'eccezione SQL quando lo faccio perché i gruppi SQL generati da parent.id ma selezionano anche molte altre colonne. –

+0

@Thomas Ah sì, infatti, ho aggiornato la mia risposta di conseguenza –

0

Grazie. Stavo cercando il numero di bambini per un genitore in particolare e i tuoi post mi hanno portato nella giusta direzione.

Nel caso qualcuno altro ha bisogno di trovare il numero di bambini per un particolare genitore, si potrebbe usare qualcosa di simile:

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()); 
Problemi correlati