2010-01-29 10 views
6

Tengo una asignación de uno a varios entre una entidad principal y entidades secundarias. Ahora necesito encontrar la cantidad de hijos asociados con cada padre para una lista de padres. Estoy tratando de hacer esto con HQL, pero no estoy seguro de cómo puedo obtener la lista de padres allí. Además, no sé cómo puedo devolver la entidad en sí y no solo su ID. Mi consulta HQL actual es:Obtener el recuento de niños a través de HQL

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

pero esto solo devuelve la ID y no filtra en padres específicos.

EDITAR Sobre la base de la respuesta de Pascal he modificado la consulta a

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

Eso funciona, pero es prohibitivamente lento: 30 segundos en lugar de 400 ms en la misma base de datos.

+0

De hecho, eso es terriblemente lento. Apenas aceptablemente aceptable ... –

+0

Los índices pueden (énfasis en mayo) ayudar con la velocidad, pero la otra opción es dividir la consulta de hql en partes si es posible - He encontrado que a veces ayuda. O puede hacer consultas separadas para cada elemento padre y crear el mapa usted mismo. Un buen perfilador de base de datos probablemente ayudará con la exploración. – aperkins

+0

La solución que elegí al final es recuperar primero todos los padres de la base de datos, luego ejecutar la consulta que me proporciona los ID y los recuentos principales y luego combinarlos en Java. De todos modos, tengo que reunir a todos los padres y fusionar esa lista con el recuento de niños lleva menos de un segundo, lo que está bien en esta situación. –

Respuesta

4

no estoy 100% seguro de eso, pero ¿qué pasa con esto:

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

No funciona, obtengo una Excepción de SQL al hacer eso porque los grupos de SQL generados por parent.id pero selecciona muchas otras columnas también. –

+0

@Thomas Ah sí, de hecho, he actualizado mi respuesta en consecuencia –

0

Gracias. Estaba buscando el número de hijos de un padre en particular y sus publicaciones me llevaron en la dirección correcta.

En caso de que alguien más tiene que encontrar el número de niños por uno de sus padres en particular, usted podría utilizar algo como esto:

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()); 
Cuestiones relacionadas