如何在hibernate环境中使用foreignkey获取数据



我有两个实体,其中学生与地址有多对一的关系。在《学生》中,我在示例中使用了以下片段。

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="ADDRESS_NR", nullable=false)
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
public Address getStudentAddress() {
return this.studentAddress;
}

现在我正试图使用ADDRESS_NR获取历史表数据,但我得到的错误如下

并且检索的代码片段是

List personHistory = AuditReaderFactory.get(entityManager)
.createQuery()
.forRevisionsOfEntity(Student.class, false, true)
.add(AuditEntity.property("ADDRESS_NR")
.eq(id))
.getResultList();

错误如下

org.hibernate.QueryException:无法解析属性:com.audit.test.Student_AUD的ADDRESS_NR[从com.audit.est.Student_AUD e__,com.audit.test中选择e__,r。AuditRevisionEntity r,其中e__.ADRESS_NR=:_p0和e__.originalId.REV.id=r.id order by e_.originaalId.REV.id asc]">

有人能帮我吗?

在这种情况下,理解列和属性之间的区别很重要。

无论何时使用AuditProperty#property(String)方法,都会要求Envers将对象模型属性解析为列映射,因此需要确保在代码片段中提供属性名称,而不是显式列名。

换句话说,我希望您的代码能够执行以下操作:

List personHistory = AuditReaderFactory.get(entityManager)
.createQuery()
.forRevisionsOfEntity(Student.class, false, true)
.traverseRelation("studentAddress", JoinType.LEFT, "address")
.up()
.add(AuditEntity.relatedId("studentAddress").eq(id))
.getResultList();

我在这里包含了traverseRelation方法调用,以说明如果需要,如何在Address关系上添加额外的谓词,方法是在调用up()之前包含这些谓词,因为它们将是基于与Address关联的联接表的谓词。

最新更新