web-dev-qa-db-fra.com

JOIN FETCH multiples dans une requête JPQL

J'ai ci-dessous des entités:

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 */
}

et je veux récupérer toutes les catégories avec des sujets joints et des articles joints à l'aide d'une requête JPQL. J'ai été écrit comme ci-dessous:

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

Mais j'ai l'erreur

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

J'ai trouvé des articles sur cette erreur, mais ces articles ne décrivent que des situations où dans une entité se trouvent deux collections à joindre. Mon problème est un peu différent et je ne sais pas comment le résoudre.

Il est possible de faire en une seule requête?

Désolé pour mon mauvais anglais, mais je parle habituellement dans une autre langue

24
Zaprogramowany

Vous pouvez utiliser une stratégie de récupération parent-enfant et recombiner l'arborescence d'entités à partir du résultat.

SELECT p 
FROM Post p 
JOIN FETCH p.topic t 
JOIN FETCH t.category c 
WHERE ...
37
Vlad Mihalcea

Voici un exemple pratique de jointure complexe et de consition multiple:

    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);
5
wangf

Une solution de contournement consiste à utiliser @Query et @EntityGraph ensemble, comme cela est mentionné ici tilisez @Query et @EntityGraph ensemble

0
koly