我有两个实体,其中学生与多对多关系。在学生中,我在示例中使用了以下代码段。
@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:无法解析属性:ADDRESS_NR:com.audit.test.Student_AUD [从com.audit.test.Student_AUD e__中选择e__,com.audit.test.AuditRevisionEntity r在其中e __。ADDRESS_NR =:_p0和e__.originalId.REV.id = r.id由e__.originalId.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
关联。