Я пишу JPQL-запрос, который объединяется в три таблицы. В моем результирующем списке я хотел бы получить все три сущности в каждой строке (надеюсь, что это имеет смысл).
Любые идеи?
Hibernate 3.x - мой поставщик JPA.
Я пишу JPQL-запрос, который объединяется в три таблицы. В моем результирующем списке я хотел бы получить все три сущности в каждой строке (надеюсь, что это имеет смысл).
Любые идеи?
Hibernate 3.x - мой поставщик JPA.
IIRC, вы можете сделать SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE ....
, и результат будет List<Object[3]>
, где содержимое массива будет содержать значения o1, o2, o3.
Это образец данных Spring, однако он работает аналогично в 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);
Затем я вызываю этот метод и печатаю результаты:
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);
}
Выход @Test находится здесь:
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 ]
Приветствия
Поскольку вы спрашиваете JPA: Query that returns multiple entities
, EclipseLink тоже попадает под него. И я потянул на этот вопрос googling для EclipseLink. Итак, вот мое решение. Надеюсь, это сработает для вас.
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);
Затем вы можете прокручивать объекты результата и соответственно их изменять.
for (Object result : query.getResultList()) {
myList.add((Post) result);
}
Вы также можете попробовать это,
Query query = entityManager.createQuery("select p from Post p where p.publisher.pubId= :ID order by p.createdAt desc");
Ссылка: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL