Hibernate Envers 使用自定义查询查询 Audit table

Hibernate Envers query Audit table with custom query

我正在使用 Hibernate Envers 来审计实体。有可能像这样获取实体的所有版本/修订:

AuditQuery auditQuery = auditReader.createQuery().forRevisionsOfEntity(
                Soup.class, true, true);
        auditQuery.add(AuditEntity.property("id").eq(id));
        List<Soup> from = auditQuery.getResultList();

但这需要太多时间,因为它将所有 table 连接在一起(在本例中为 rev,soup_aud,ingredients_aud)。我只需要 Soup_AUD 中的值。

如何使用自定义查询 select 来自审计 table 的值?

Soup.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;

}

Ingredient.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 上提供一个 setFetchMode 方法来反映其 Criteria API 对应方法。

所有这些都是对 Envers 的增强;其中的贡献将受到欢迎。第一个元素已经有一个为后者记录为 HHH-13817. I have also logged HHH-13818 的功能请求。

我现在的解决方案是来自 JPA 存储库的 nativeQuery。