我想问是否有一种方法可以使用自定义查询来查找修订的实体。 原因是我想完全控制我的实体何时加载,有时我还有一些更复杂的连接,这些连接不太容易反映
以下是我的(示例)实体:
@Data
@Entity
@Audited
@Table(name = "Product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private BigDecimal price;
private Long orderId;
@ManyToOne
@JoinColumn(name = "ORDER_ID", insertable = false, updatable = false)
private Order order;
}
@Data
@Entity
@Audited
@Table(name = "Order")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String text;
private BigDecimal amount;
}
我想做这样的事情
public void findProductByOrderIdAndRevision(Long orderId, Long revisionFromOrder) {
AuditReader auditReader = AuditReaderFactory.get(entityManager);
return auditReader.createQuery().forEntitiesAtRevision(Product.class, revisionFromOrder)
.traverseRelation("order", JoinType.INNER, "products", AuditEntity.id().eq(orderId))
.getResultList();
}
但这也会返回旧值,这些值在本次修订时不存在于关系中
有什么可能的方法来实现这一目标吗?
致以诚挚的问候
(我真的不明白为什么你的查询会返回错误的结果,也许你可以查看可以使用
org.hibernate.sql: INFO
记录的实际SQL)
否则,您实际上可以使用 envers 实体编写 HQL 查询(envers 也在内部执行此操作) 命名约定类似于
"com.example.Product_AUD"
,关系表的命名就像数据库表一样。
有关底层模型的更多信息,您可以查看EnversService#getEntitiesConfigurations
。
至少这就是我对更复杂的查询所做的事情。