2011-07-29 92 views
24

我在寫一個連接三個表的JPQL查詢。在我的結果列表中,我希望每個匹配行都得到所有三個實體(希望是有道理的)。JPA:返回多個實體的查詢

任何想法?

Hibernate 3.x是我的JPA提供程序。

回答

35

IIRC,你可以做一個SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE ....,結果將是一個List<Object[3]>,其中數組內容將包含o1,o2,o3值。

+6

@約翰:另外,您可以從HQL調用構造函數,所以你也可以做'選擇新的Foo(O1,O2, o3)...'並且獲得列表而不是列表。 –

+3

好的,但是如果我想使用JPA TypedQuery會怎麼樣:myEntityManager.createQuery(「select o1,o2 ...」,) – AgostinoX

+0

如果你想使用setFirstResult實際上應用於兩個列表的連接?即我想能夠返回一個分頁列表,它是被查詢的兩個實體的結果的連接。 – Thomas

0

由於您要求JPA: Query that returns multiple entities,因此EclipseLink也屬於它。我在這個問題上搜索了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

+0

如果我需要從2個實體獲取數據說出版商和書籍? – fiddle

16

這是一個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 ] 

乾杯

+0

嗨激情,但如果我只想只Coursname,LessionID,ProgressID和用戶名..那麼該怎麼辦?如何處理列表數據。因爲當時這行不能被任何類的情況 –

+0

嗨Utkal,考慮到我的示例代碼,課程,課程,進度和用戶都是對象。您可以在每個類的toString()方法中獲得所需的字符串或整數,使@Override成爲可能。同時,對於這種情況,最好的做法是更改HQL查詢,而不是獲得課程c,您可以這樣做SELECT c.name,l.id,progress.id和u.firstname FROM ...因此,您將得到字符串和整數而不是複雜的對象。 –