问题描述
朋友!我有这些实体:
文档:
@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
有没有什么方法可以编写一个选择ChangeNotice的查询,而查询只包含一个选择? (在不更改我的实体代码的情况下,可能会有一些小的修正)
解决方法
因此,很多时间过去了,我没有找到答案。但这是我的体系结构问题。我必须使用另一个类,其中包含Document,ChangeNotice和Integer字段。我的Document和ChangeNotice实体具有@OnetoMany关系的此类的子级集合。解决了这个问题。