如何在休眠状态中使用外键获取数据?

问题描述 投票:0回答:1

我有两个实体,其中学生与多对多关系。在学生中,我在示例中使用了以下代码段。

@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]“

有人可以帮我吗?

hibernate hibernate-envers
1个回答
0
投票

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

[每当使用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关联。

© www.soinside.com 2019 - 2024. All rights reserved.