所以我有一个在我的数据库中有修订的文档。文档表包含文档的通用元数据,修订包含内容。目前,我可以使用正确的版本获取文档。
我想要做的是通过映射获取所有修订版的文档列表。
以下是我的两个实体:
@Entity
public class Document {
@Id
@Column(name="DOCUMENT_ID")
private int id;
@ManyToOne
@JoinColumn(name="DOCUMENT_REVISION_ID")
private DocumentRevisionEntity revision;
}
@Entity
public class DocumentRevisionEntity {
@Id
@Column(name="DOCUMENT_REVISION_ID")
private int id;
@Column(name="DOCUMENT_ID")
private int documentId
}
那么我希望查询所有修订版本的JPA查询,但返回类型为Document
。
答案 0 :(得分:1)
执行所需操作的简便方法是修改Document
实体。
您需要添加一个List<DocumentRevisionEntity>
,表示它将代表与Document
实例关联的所有修订版...示例:
@Entity
public class Document {
@Id
@Column(name="DOCUMENT_ID")
private int id;
@ManyToOne
@JoinColumn(name="DOCUMENT_REVISION_ID")
private DocumentRevisionEntity revision; // This is the last revision!
@OneToMany
@JoinColumn(name="DOCUMENT_ID") // unidirectional one-to-many, works for JPA2.0!!
private List<DocumentRevisionEntity> revisions = new ArrayList<>();
}
然后当您从持久层检索文档时,您还可以检索其关联的修订版本!
当心!默认情况下,@ OneToMany关系是LAZY,只有在需要时才会加载! (这是,当您从getRevisions()
管理的Document
实体调用方法EntityManager
时。根据您的上下文,此配置可能会导致N+1
子选择问题,因此请注意。
如果您不想修改您的实体 ...您可以测试此查询:
SELECT doc, rev FROM Document doc, DocumentRevisionEntity rev WHERE doc.id = rev.documentId
但是,当您从此查询中致电:query.getResultList()
时;它将带来一个List<Object[]>
,其中每个元素由一个数组组成:array [0] = Document,array [1] = DocumentRevisionEntity ...如果有多个版本的文档,这些文档将在结果中重复列表...