web-dev-qa-db-ja.com

1つのJPQLクエリで複数のJOIN FETCH

以下のエンティティがあります:

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

また、JPQLクエリを使用して、結合されたトピックと結合された投稿を含むすべてのカテゴリを取得します。私は以下のようなクエリを書いた:

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

しかし、エラーが発生しました

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

このエラーに関する記事を見つけましたが、これらの記事では、1つのエンティティに2つのコレクションが参加する状況についてのみ説明しています。私の問題は少し異なり、それを解決する方法がわかりません。

1つのクエリで実行できますか?

悪い英語で申し訳ありませんが、私は通常他の言語で話します

24
Zaprogramowany

Child-Parent fetch strategy を使用して、結果からエンティティツリーを再結合できます。

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

複雑な結合と複数の条件の実際の例を次に示します。

    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

回避策は、ここで説明したように、@ Queryと@EntityGraphを一緒に使用することです se @Queryと@EntityGraphを一緒に

0
koly