JPA: запрос, который возвращает несколько объектов - PullRequest
31 голосов
/ 29 июля 2011

Я пишу JPQL-запрос, который объединяет три таблицы.В моем списке результатов я хотел бы получить все три объекта для каждой соответствующей строки (надеюсь, что это имеет смысл).

Любые идеи?

Hibernate 3.x - мой поставщик JPA.

Ответы [ 4 ]

40 голосов
/ 30 июля 2011

IIRC, вы можете сделать SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE ...., и результатом будет List<Object[3]>, где содержимое массива будет содержать значения o1, o2, o3.

23 голосов
/ 27 мая 2014

Это пример Spring Data, однако он работает так же, как и в 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);
}

Выходные данные @Тест здесь:

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 ]

Приветствия

1 голос
/ 18 марта 2019

В случае отношения «один ко многим» или «один ко многим», как получить несколько записей об одном из объектов? скажем, A - это одна сущность, а B - другая сущность, но они имеют отношение один ко многим, и когда вы получите результат, вы ожидаете, что B имеет одну запись, а A имеет более 1 записи? Мой запрос, как показано ниже, но я не знаю, как мне получить несколько записей 2-го лица?

@Query("SELECT wl, gr FROM WatchList as wl, GeozoneReference gr " +
            "WHERE wl.watchlistId = gr.objWatchList.watchlistId " +
            "AND wl.watchlistId =:watchlistId")
    List<Object[]> findWatchlistByWatchlistId(@Param("watchlistId") Long watchlistId);
0 голосов
/ 09 сентября 2013

Так как вы спрашиваете JPA: Query that returns multiple entities, EclipseLink тоже попадает под него. И я достиг по этому вопросу поиска в Google для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...