【发布时间】:2017-07-08 14:59:29
【问题描述】:
假设我们有一个实体:
@Entity
@Audited(withModifiedFlag = true)
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false, length = 50)
private String Name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentEntityId")
private MyEntity parentEntity;
}
我尝试让 envers 在表示关系的实体字段上返回实体修订信息。我使用addProjection 创建自己的数据表示。问题是每次我与addProjection 一起使用代表关系的字段名称时都会出错(如果我使用普通列则不会出错)。
我构建了一个审计查询:
AuditQuery auditQuery = reader.createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);
auditQuery.addProjection(AuditEntity.revisionNumber());
auditQuery.addProjection(AuditEntity.revisionType());
auditQuery.addProjection(AuditEntity.revisionProperty("timestamp"));
auditQuery.addProjection(AuditEntity.id());
auditQuery.addProjection(new AuditProperty<>(
new EntityPropertyName("parentEntity")));
auditQuery.addProjection(new AuditProperty<>(
new ModifiedFlagPropertyName(
new EntityPropertyName("parentEntity"))));
错误是:
org.hibernate.QueryException: could not resolve property: parentEntity of: edu.sample.domain.entity.MyEntity_AUD
我也尝试过:new EntityPropertyName("parentEntityId") - 结果是:
org.hibernate.QueryException: could not resolve property: parentEntityId of: edu.sample.domain.entity.MyEntity_AUD
编辑:
我错过了审计查询中的一条语句。投影应包括 parentEntity 字段值,而不仅仅是修改标志:
auditQuery.addProjection(new AuditProperty<>(
new EntityPropertyName("parentEntity")));
我需要字段的值和修改后的信息。这就是为什么我使用withModifiedFlag = true
问题是 MyEntity_AUD 表的架构(自动生成)包含字段 parentEntityId。修改后的标志字段名称为parentEntity_MOD。将以下投影添加到查询后会出现错误:
addProjection(new AuditProperty<>( new EntityPropertyName("parentEntity")));
或
addProjection(new AuditProperty<>( new EntityPropertyName("parentEntityId")));
修改标志正确返回,没有错误。以及普通字段的值。
【问题讨论】:
-
在指定
selectOnlyEntities=false时,是否有特定原因需要使用投影而不是使用返回的Object[]?
标签: java hibernate spring-data-jpa hibernate-envers