【问题标题】:(N + 1) selects problem with child Map-collection(N + 1) 选择子地图集合的问题
【发布时间】:2020-08-28 10:20:05
【问题描述】:

朋友们!我有这些实体:

文档:

@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;
....

}

和变更通知:

@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);
....

}

对于变更通知:

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 获取 Document 时,这不是问题,我只有一个选择。 但是当我想获得带有文档的 ChangeNotice 时 - 我有 (n + 1),首先是文档,n 是 changeNotices Map。

我在查询中使用了 join fetch,但它没有帮助。 我认为问题是在 Document 我有 Map,其中实体是一个值,我应该使用 @ManyToMany 关系。在 ChangeNotice 我有 Map,其中实体是一个键,我应该使用 @ElementCollection。

有没有什么方法可以编写一个查询,在一次选择中选择 ChangeNotice 和文档? (不更改我的实体代码,可能会进行一些小的修复)

【问题讨论】:

  • 你用的是什么休眠版本?
  • 我用的是5.4.2版本

标签: sql spring hibernate jpa spring-data-jpa


【解决方案1】:

所以,已经过去了很多时间,我没有找到答案。但这是我的架构问题。我不得不使用另一个类,它包含 Document、ChangeNotice 和 Integer 字段。我的 Document 和 ChangeNotice 实体具有具有 @OnetoMany 关系的此类的子集合。它解决了问题。

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 2011-06-17
    • 2020-01-16
    • 2011-02-05
    • 2012-09-29
    • 2011-06-08
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多