java - operadores - para que sirven las funciones de agregacion
JPA y funciones agregadas. ¿Cómo uso el resultado de la consulta? (1)
Soy nuevo en materia de ORM y necesito ayuda para entender algo.
Supongamos que tengo la siguiente consulta SQL estándar:
SELECT *, COUNT(test.testId) AS noTests FROM inspection
LEFT JOIN test ON inspection.inspId = test.inspId
GROUP BY inspection.inspId
que quiero usar en JPA.
Tengo una entidad de inspección con una relación uno a muchos con una entidad de prueba. (una inspección tiene muchas pruebas) Intenté escribir esto en JPQL:
Query query = em.createQuery("SELECT insp, COUNT(???what???) " +
"FROM Inspection insp LEFT JOIN insp.testList " +
"GROUP BY insp.inspId");
1) ¿Cómo escribo la cláusula COUNT? Tendría que aplicar recuento a los elementos de la tabla de prueba, pero testList es una colección, por lo que no puedo hacer algo como COUNT(insp.testList.testId)
2) Suponiendo que se resuelva 1, qué tipo de objeto se devolverá. Definitivamente no será un objeto de inspección ... ¿Cómo uso el resultado?
- Puede dar un alias a la entidad unida (con
AS
) - Puede crear un nuevo objeto o una
List
con los valores devueltos
Asi que:
SELECT new com.yourproject.ResultHolder(insp, COUNT(test.testId))
FROM Inspection insp LEFT JOIN insp.testList AS test GROUP BY insp.inspId
O
SELECT new list(insp, COUNT(test.testId))
FROM Inspection insp LEFT JOIN insp.testList AS test GROUP BY insp.inspId
El resultado se puede acceder como una instancia de ResultHolder
o como java.util.List
, donde el insp
es list.get(0)
y el conteo es list.get(1)