【发布时间】: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
有没有什么方法可以编写一个查询,在一次选择中选择 ChangeNotice 和文档? (不更改我的实体代码,可能会进行一些小的修复)
【问题讨论】:
-
你用的是什么休眠版本?
-
我用的是5.4.2版本
标签: sql spring hibernate jpa spring-data-jpa