N +1选择子Map-Collection的问题

问题描述

朋友!我有这些实体:

文档:

@Entity
@Table(name = "documents")
public class Document extends AbstractNamedEntity {

....
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "document_change_notices",joinColumns = @JoinColumn(name = "document_id"),inverseJoinColumns = @JoinColumn(name = "change_notice_id"))
    @MapKeyColumn(name = "change")
    private Map<Integer,ChangeNotice> changeNotices;
....

}

和ChangeNotice:

@Entity
@Table(name="change_notices")
public class ChangeNotice extends AbstractNamedEntity {

....
    @ElementCollection(fetch = FetchType.LAZY)
    @CollectionTable(name = "document_change_notices",joinColumns = @JoinColumn(name = "change_notice_id"))
    @MapKeyJoinColumn(name = "document_id")
    @Column(name = "change")
    private Map<Document,Integer> documents;
....

}

这些是我的存储库:

对于文档:

public interface DocumentRepository extends JpaRepository<Document,Integer> {

....
    @Query("select d from Document d left join fetch d.changeNotices where d.decimalNumber=:decimalNumber")
    Optional<Document> findByDecimalNumberWithChangeNotices(@Param("decimalNumber") String decimalNumber);
....

}

,并发出ChangeNotice:

public interface ChangeNoticeRepository extends JpaRepository<ChangeNotice,Integer> {

....
    @Query("select c from ChangeNotice c left join fetch c.documents where c.id=:id")
    Optional<ChangeNotice> findByIdWithDocuments(@Param("id") int id);
....

}

因此,当我想获取带有changeNotices的文档时,那不是问题,我只有一个选择。 但是,当我想获取带有文档的ChangeNotice时-我有(n + 1)个,第一个是document,第n个是changeNotices Map。

我在查询中使用join fetch,但这无济于事。 我认为问题在于文档中有Map ,其中实体是一个值,我应该使用@ManyToMany关系。在ChangeNotice中,我有Map ,其中实体是键,我应该使用@ElementCollection。

有没有什么方法可以编写一个选择ChangeNotice的查询,而查询只包含一个选择? (在不更改我的实体代码的情况下,可能会有一些小的修正)

解决方法

因此,很多时间过去了,我没有找到答案。但这是我的体系结构问题。我必须使用另一个类,其中包含Document,ChangeNotice和Integer字段。我的Document和ChangeNotice实体具有@OnetoMany关系的此类的子级集合。解决了这个问题。