2015-05-06 32 views
11

mam poniżej podmioty:Multiple dołączyć pobrać w jednym zapytaniu JPQL

public class Category { 
    private Integer id; 
    @OneToMany(mappedBy = "parent") 
    private List<Topic> topics; 
} 

public class Topic { 
    private Integer id; 
    @OneToMany(mappedBy = "parent") 
    private List<Posts> posts; 
    @ManyToOne 
    @JoinColumn(name = "id") 
    private Category parent; 
} 

public class Post { 
    private Integer id; 
    @ManyToOne 
    @JoinColumn(name = "id") 
    private Topic parent; 
    /* Post fields */ 
} 

i chcę pobrać wszystkie kategorie połączone z tematów i dołączył posty użyciu JPQL zapytania. Ja napisałem zapytanie jak poniżej:

SELECT c FROM Category c JOIN FETCH c.topics t JOIN FETCH t.posts p WHERE ... 

Ale mam błąd

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 

znalazłem artykuły o tym błędzie, ale tylko te artykuły opisują sytuację, w której w jednym podmiocie są dwa zbiory się przyłączyć. Mój problem jest trochę inny i nie wiem jak go rozwiązać.

Jest to możliwe w jednym zapytaniu?

Przepraszam za mój zły język angielski, ale zazwyczaj mówią w innym języku

Odpowiedz

22

Można użyć Child-Parent fetch strategy i rekombinacji drzewo podmiot z wyniku.

SELECT p 
FROM Post p 
JOIN FETCH p.topic t 
JOIN FETCH t.category c 
WHERE ... 
+1

W końcu to artykuł: "Chociaż zawsze lepiej jest po prostu użyć indeksowanych list lub zestawów". Jak utworzyć listę indeksowaną? – Zaprogramowany

+0

To jest temat innego pytania, na które jestem pewien, że już na nie odpowiedziano. –

1

Oto przykład roboczych od kompleksu dołączyć i stwardnienie consition:

String query_findByProductDepartmentHospital = "select location from ProductInstallLocation location " 
      + " join location.product prod " + " join location.department dep " 
      + " join location.department.hospital hos " + " where prod.name = :product " 
      + " and dep.name.name = :department " + " and hos.name = :hospital "; 

    @Query(query_findByProductDepartmentHospital) 
    ProductInstallLocation findByProductDepartmentHospital(@Param("product") String productName,@Param("department") String departName, @Param("hospital") String hospitalName);