2012-07-31 20 views
8

ile her varlığın en son revizyonunu listelemiyorum Silinmemiş olan tüm tüm varlıkları almaya çalışıyorum.Envanter

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

Ama envers API üzerinden bu nasıl uygulanacağı bir ipucu, yok: SQL bu yapmamak bir subselect ile çok basittir. Birçok ile birçok makale (varlıkları) var çünkü bir veya en az iki sorgularda bunu yapmak istiyor: Ben AuditReader ile başladı ama farklı nesneler

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; 
} 

Önemli seçmek için bir yol bulamadık revizyonları.

Çok teşekkürler!

cevap

7

https://hibernate.atlassian.net/browse/HHH-7827, yani AuditEntity.revisionNumber() .growset() .computeAggregationInInstanceContext() düzeltmesini kullanmamız gerekir. Bütün varlıklar için değil, belirli biri için son revizyon bulmak istiyoruz Ama - Cevabınız için

Find max revision of each entity less than or equal to given revision with envers

Can hibernate envers return the latest revision of all entities of a specific type?

+0

Bir varlığın en son revizyon numarasını almanın bir yolu var mı? Bir varlık eklendiğini, iki kez güncellendiğini ve şimdi 3 düzeltme numarasına sahip olduğunu varsayalım. Son revizyon numarasını nasıl alabilirim? – AppSensei

+0

Hmm Bu, sorguda döndürülen birden çok düzeltim olduğunda işe yarar görünüyor, toplama işlevi bana en son (en yüksek) revizyonu veriyor. Ancak sadece bir revizyon varsa, hiç bir revizyona geri dönmez. Bu sorunu yaşadın mı? – chrismacp

+0

Aslında, nasıl çalıştığını yanlış anlamıyorum. Bir varlığın en son revizyonunu filtrelerseniz, bu varlık iade edilmez. Düzeltmeleri filtreledikten sonra varlığın en son sürümünü istedim. Yani Çarşamba gününden önce tüm revizyonları bana verin ve o alt kümedeki varlığın en son sürümünü bana verin. Bu şekilde çalışmıyor gibi görünüyor. – chrismacp

0

bu çalışacaktır:

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; 
    } 
    }); 

}

ve sonra

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; 
    } 
    }); 

}

+0

Teşekkür: için

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(); 

Ayrıca bakınız. – powerMicha

0

deneyin bir maksimize özellik ekleyerek:

[your query].add(AuditEntity.revisionNumber().maximize()) 
+0

için sorgulamak için bir kimliğim yok Bu yalnızca yeniden gönderilen çok sayıda varlığın gözden geçirilmesini sağlayacaktır. Her bir varlık varlığının en son revizyonuna ihtiyacım var – powerMicha

+0

Hmm denediniz mi? Sorgudaki gibi bir max() alt sorgu ile bir sorgu oluşturması gerektiğini düşünüyorum. – adamw

+0

Evet Denedim. Ve evet, max() ile bir alt sorgu oluşturur, ancak alt sorgu kimlik başına değerlendirilmez, sonuçta elde edilen sorgu bu gibi görünüyor 'select_madde aud1'den select1 (article_aud aud2'den max (dev) öğesini seçin)' Karşılaştırma tarafından kimliği eksik – powerMicha

İlgili konular