2016-01-31 74 views
0

假設我們有一個審計單位如:在休眠Envers最新修改的實體日期

@Entity 
@Audited 
public class Person { 

    @Id 
    private Long id; 

    private String name; 

} 

和存儲/更新幾百的記錄後,我需要獲得最新修改的實體給定一組id s。鑑於Envers表的邏輯,這將是簡單的:

SELECT MAX(R.REVTSTMP) FROM PERSON_AUD P JOIN REVINFO R ON P.REV = R.REV 
WHERE P.ID IN (12, 35, 143, 151, 165, 188, 234, 251); 

,但我不能找到一個辦法讓通過JPA或Envers API此信息。請注意,我正在尋找一種「Enver的方式」來做到這一點,試圖避免本機SQL(加上審計表存儲在實體的一個單獨的目錄中)。

+0

現在我正在獲取所有實體,並使用列表中的流來計算最新修訂日期,但由於我需要加載所有實體,因此效率非常低。 –

回答

0

您可以通過AuditQuery擴展實現這一點:

Object[] results = (Object[]) AuditReaderFactory.get(entityManager) 
    .createQuery() 
    .forRevisionsOfEntity(YourEntity.class, false, false) 
    .add(AuditEntity.revisionNumber().in(idsList)) 
    .addOrder(AuditEntity.revisionNumber().desc()) 
    .setMaxResults(1)  
    .getSingleResult(); 

// Object[0] = YourEntity instance 
// Object[1] = The RevisionEntity instance 
// Object[2] = RevisionType enum value 

我們目前不暴露AuditEntity.revisionTimestamp()屬性訪問器,所以你必須直接從Object[1]修訂實體實例獲取價值。

+0

增加了JIRA增強請求:https://hibernate.atlassian.net/browse/HHH-11462 – Naros