gpt4 book ai didi

java - 返回对象的特定修订版

转载 作者:行者123 更新时间:2023-12-02 02:27:14 24 4
gpt4 key购买 nike

我想让我的 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,然后不选择任何内容,因为修订版应低于 2。

我似乎不知道如何修复该查询,并且关于该主题的文档很少。我尝试删除 computeAggregationInInstanceCont() ,但代码的行为方式没有变化。

获得低于用户定义值的最高修订版的正确查询是什么?

最佳答案

您应该能够获取低于指定值的最高修订号,如下所示:

AuditReaderFactory.get( session )
.createQuery()
.forRevisionsOfEntity( EntityClass.class, true, true )
.addOrder( AuditEntity.revisionNumber().desc() )
.add( AuditEntity.id().eq( entityId ) )
.add( AuditEntity.revisionNumber().le( userSuppliedValue ) )
.setMaxResults( 1 )
.singleResult();

这将以降序对所有修订进行排序并返回第一个条目。结果集中的行将针对具有主键 entityIdEntityClass 实体,并应用必须以小于或等于修订号审核实体的限制- 为提供的值。

关于java - 返回对象的特定修订版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47632909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com