2010-05-26 34 views
7

Soy nuevo en materia de ORM y necesito ayuda para entender algo.JPA y funciones agregadas. ¿Cómo uso el resultado de la consulta?

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 utilizar en APP.

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 se escribe la cláusula CUENTA? Tendría que aplicar recuento a los elementos de la tabla de prueba pero testList es una colección, así que no puedo hacer algo como COUNT(insp.testList.testId)

2) Suponiendo que se resuelva 1, qué tipo de objeto será devuelto. Definitivamente no será un objeto de inspección ... ¿Cómo uso el resultado?

Respuesta

16
  1. Usted puede dar un alias a la entidad unido (con AS)
  2. Puede crear un nuevo objeto, o una List con los valores devueltos

Por lo tanto:

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 es entonces accesible, ya sea como una instancia de ResultHolder, o como java.util.List, donde el insp es list.get(0), y el recuento es list.get(1)

+0

Muchas gracias. ¡Funciona! – Bogdan

Cuestiones relacionadas