我正在使用Hibernate Envers来审计实体。有可能像这样获取实体的所有版本/修订:
AuditQuery auditQuery = auditReader.createQuery().forRevisionsOfEntity(
Soup.class, true, true);
auditQuery.add(AuditEntity.property("id").eq(id));
List<Soup> from = auditQuery.getResultList();
但这需要太多时间,因为它将所有表连接在一起(在此示例中为 rev、soup_aud、ingredients_aud(。我只需要Soup_AUD的值。
如何使用自定义查询从审核表中选择值?
汤.java:
@Entity
@Table(name = "SOUP")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Wither
@Audited
public class Soup {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(cascade = {CascadeType.ALL}, orphanRemoval = true)
@JoinColumn(name = "INGREDIENT_ID")
private List<Ingredient> ingredients;
}
成分.java:
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Wither
@Audited
public class Ingredient {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
我认为连接发生的原因是由于@OneToMany
是关系的拥有方而不是相反方的性质。 如果您无法修改映射,那么不幸的是,我不相信目前有办法避免加入。
我可以看到添加以支持这一点的是
- 展开
RevisionsOfEntityQuery
类型的traverseRelation
- 在
AuditQuery
上提供反映其Criteria
API 对应项的setFetchMode
方法。
所有这些都将是Envers的增强;其中的贡献将受到欢迎。 第一个元素已将功能请求记录为 HHH-13817。 我还为后者记录了 HHH-13818。
我现在的解决方案是来自 JPA 存储库的 nativeQuery。