query namedquery manager inner example ejemplos create consultas java hibernate jpa jpql

java - namedquery - JPA: consulta que devuelve varias entidades



jpql java example (3)

Como Usted está preguntando a JPA: Query that returns multiple entities , EclipseLink también se incluye en él. Y llegué a esta pregunta buscando en Google EclipseLink. Así que aquí está mi solución. Espero que funcione para ti.

TypedQuery<Object[]> query = entityManager.createQuery("select p from Post p where p.publisher.pubId= :ID order by p.createdAt desc", Object[].class); query.setParameter("ID", publisherID);

Luego puede recorrer los objetos resultantes y emitirlos en consecuencia.

for (Object result : query.getResultList()) { myList.add((Post) result); }

También puedes probar esto,

Query query = entityManager.createQuery("select p from Post p where p.publisher.pubId= :ID order by p.createdAt desc");

Referencia: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL

Estoy escribiendo una consulta JPQL que se une a través de tres tablas. En mi lista de resultados me gustaría obtener las tres entidades por fila correspondiente (espero que tenga sentido).

¿Algunas ideas?

Hibernate 3.x es mi proveedor de JPA.


Esta es una muestra de Spring Data, sin embargo, funciona de la misma manera en JPA

//HQL query @Query("SELECT c,l,p,u FROM Course c, Lesson l, Progress p, User u " + "WHERE c.id=l.courseId AND l.id = p.lessonId AND p.userId = u.id AND u.id=:userId AND c.id=:courseId") public List<Object[]> getLessonsWithProgress(@Param("userId") Integer userId, @Param("courseId")Integer courseId);

Luego, llamo a este método e imprimo los resultados:

List<Object[]> lst = courseRepository.getLessonsWithProgress(userId, courseId); for (Object o[] : lst) { Course c = (Course) o[0]; Lesson l = (Lesson) o[1]; Progress p = (Progress) o[2]; User u = (User) o[3]; //all the classes: Course, Lesson, Progress and User have the toString() overridden with the database ID; System.out.printf("/nUser: %s /n Lesson: %s /n Progress: %s /n Course: %s",u,l,p,c); }

El resultado @Test está aquí:

User: com.cassio.dao.model.User[ id=1965 ] Lesson: com.cassio.dao.model.Lesson[ id=109 ] Progress: com.cassio.dao.model.Progress[ id=10652 ] Course: com.cassio.dao.model.Course[ id=30 ]

Aclamaciones


IIRC, puede hacer un SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE .... , y el resultado será una List<Object[3]> , donde los contenidos de la matriz contendrán el o1, o2, o3 valores.