【发布时间】:2017-12-04 12:00:56
【问题描述】:
我想让我的 Envers 返回具有最高修订但仍低于给定修订号的实体。
我想出的是以下内容:
@PersistenceContext
private EntityManager em;
@Test
public void test() throws Exception {
final Number before = AuditReaderFactory.get(this.em).getRevisionNumberForDate(new Date(Long.MAX_VALUE));
final UserEntity user = new UserEntity().loginName("one");
doInTransaction(() -> this.em.persist(user));
final Number middle = AuditReaderFactory.get(this.em).getRevisionNumberForDate(new Date(Long.MAX_VALUE));
user.setLoginName("two");
doInTransaction(() -> this.em.persist(user));
final Number after = AuditReaderFactory.get(this.em).getRevisionNumberForDate(new Date(Long.MAX_VALUE));
Assert.assertEquals(new ArrayList<>(), getRevisions(before));
Assert.assertEquals(Arrays.asList(user), getRevisions(middle));
Assert.assertEquals(new ArrayList<>(), getRevisions(after));
}
private void doInTransaction(Runnable magic) {
try {
this.em.getTransaction().begin();
magic.run();
this.em.getTransaction().commit();
} catch (final Exception e) {
this.em.getTransaction().rollback();
throw new RuntimeException(e);
}
}
private List<UserEntity> getRevisions(Number revisionNumber) {
final AuditReader auditReader = AuditReaderFactory.get(this.em);
try {
return auditReader.createQuery().forRevisionsOfEntity(UserEntity.class, true, false)
.add(AuditEntity.revisionNumber().maximize().computeAggregationInInstanceContext()) // the highest revision possible
.add(AuditEntity.revisionNumber().le(revisionNumber)) // as long as the revision is below or equal to revisionNumber
.getResultList();
} catch (final NoResultException e) {
return null;
}
}
不起作用的方法是getRevisions(Object, Number)。它没有返回 before 修订版(这是正确的),它仍然没有返回 middle 修订版(不正确,现在实体存在!),然后返回 after 修订版(也不正确,实体已删除)。
当我们查看生成的 SQL 时,这种行为的原因就很清楚了:
SELECT * from user_aud u
WHERE u.REV = (
SELECT MAX (v.REV)
FROM user_aud v
WHERE v.id=u.id
)
AND u.REV <= ? ORDER BY u.REV asc
u.REV <= ? 部分应该在内部查询中。它现在生成的方式 Hibernate 决定最大修订为 3,然后什么都不选择,因为 rev 应该低于 2。
我似乎无法弄清楚如何修复查询,并且关于该主题的文档很少。我尝试删除 computeAggregationInInstanceCont(),但代码的行为方式没有变化。
获取低于用户定义值的最高版本的正确查询是什么?
【问题讨论】:
标签: java hibernate hibernate-envers