10

削除されていないすべてのエンティティの最新リビジョンを取得しようとしています。SQL でこれを行うのは、サブセレクトを使用すると非常に簡単です。

select * from article_aud aud1
where rev in
 (select max(rev) from article_aud aud2
  where aud1.id = aud2.id)
and revtype < 2

しかし、envers API を介してこれを実装する方法はわかりません。私はAuditReaderから始めましたが、個別のオブジェクトを選択する方法が見つかりませんでした

public List<Object[]> findLatestArticleRevisions(){
    List<Object[]> results = (List<Object[]>) getJpaTemplate().execute(new AuditReaderCallback() {
        @Override
        public Object doInAuditReader(AuditReader auditReader) {
            return auditReader.createQuery().forRevisionsOfEntity(Article.class, false, false)
                // TODO select distinct on entities
                .addOrder(new PropertyAuditOrder(new RevisionNumberPropertyName(), false))
                .getResultList();
        }
    });

    return results;
}

重要: 多くのリビジョンを含む多くの記事 (エンティティ) があるため、1 つまたは少なくとも 2 つのクエリでこれを実行したいと考えています。

どうもありがとう!

4

4 に答える 4

9

https://hibernate.atlassian.net/browse/HHH-7827の修正、すなわち AuditEntity.revisionNumber().maximize().computeAggregationInInstanceContext()を使用する必要があります。

    AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(
            entityClass, false, false);
    query.add(AuditEntity.revisionNumber().le(revision));
    query.add(AuditEntity.revisionNumber().maximize()
            .computeAggregationInInstanceContext());
    query.addOrder(AuditEntity.revisionNumber().desc());
    return query.getResultList();

以下も参照してください。

envers を使用して、指定されたリビジョン以下の各エンティティの最大リビジョンを検索します

hibernate envers は、特定のタイプのすべてのエンティティの最新リビジョンを返すことができますか?

于 2014-09-11T10:55:59.033 に答える
0

これは機能します:

    public <T extends AbstractPersistentEntity> Number latestRevision(final Class<T> entityClass,
        final long uniqueIdentifier) {
  return hibernateTemplate.execute(new HibernateCallback<Number>() {
     @Override
     public Number doInHibernate(Session session) throws HibernateException, SQLException {
        try {
           Number number = (Number) get(session).createQuery()
                    .forRevisionsOfEntity(entityClass, true, true)
                    .addProjection(AuditEntity.revisionNumber().max())
                    .add(AuditEntity.id().eq(uniqueIdentifier)).getSingleResult();
           if (number != null) {
              logger.debug("max_rev = %s for entity_class %s.%s", number,
                       entityClass.getSimpleName(), uniqueIdentifier);
           }
           return number;
        } catch (javax.persistence.NoResultException e) {
           logger.debug(
                    "unable to find revision number by[entity_class=%s,unique_identifier=%s]",
                    entityClass.getName(), uniqueIdentifier);
        }
        return null;
     }
  });

}

その後

    protected <T extends AbstractPersistentEntity> T loadForRevision(final Class<T> entityClass,
        final long uniqueIdentifier, final Number revisionNumber) {
  return (T) hibernateTemplate.execute(new HibernateCallback<Object>() {
     @Override
     public Object doInHibernate(Session session) throws HibernateException, SQLException {
        T result = get(session).find(entityClass, uniqueIdentifier, revisionNumber);
        return result;
     }
  });

}

于 2012-07-31T14:31:00.463 に答える
0

最大化されたプロパティを追加してみてください:

[your query].add(AuditEntity.revisionNumber().maximize())
于 2012-08-01T06:05:59.120 に答える