2011-07-29 35 views

Respuesta

35

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

+6

@ John: Además, puede invocar constructores de HQL, por lo que podría también qué 'select new Foo (O1, O2, o3) ... 'y obtenga una lista en lugar de una lista . –

+3

Ok, pero ¿y si quiero usar un JPA TypedQuery: myEntityManager.createQuery ("seleccionar o1, o2 ...", <¿qué poner aquí?>) – AgostinoX

+0

¿Qué pasaría si quisiera usar setFirstResult que realmente se aplicaría al concatenación de ambas listas? es decir, quiero poder devolver una lista paginada que es la concatenación del resultado para las dos entidades consultadas. – Thomas

0

Dado que usted está preguntando JPA: Query that returns multiple entities, EclipseLink también está incluido 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 convertirlos en consecuencia.

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

También puede 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

+0

¿Qué sucede si necesito obtener los datos de 2 entidades, dicen el editor y los libros? – fiddle

16

Ésta es una muestra de la primavera de datos, sin embargo sus obras 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); 

Entonces , 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); 
} 

La salida @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 ] 

Saludos

+0

Hola Cassion, pero ¿por qué solo quiero Coursname, LessionID, ProgressID y nombre de usuario ... entonces qué hacer? cómo manejar los datos de la lista.Porque en ese momento esta fila no puede ser el caso de ninguna clase –

+0

Hola Utkal, teniendo en cuenta que mi código de muestra, Curso, Lección, Progreso y Usuario son objetos. Puede obtener el String o Integer deseado haciendo @Override en el método toString() de cada clase. Mientras tanto, la mejor práctica para ese caso es cambiar la consulta HQL, en lugar de eso, obtener el Curso c, puedes hacerlo de esa manera SELECCIONAR c.nombre, l.id, progress.id y u.firstname FROM ... Así que obtendrá las cadenas y enteros en lugar de los objetos complejos. –

Cuestiones relacionadas