2011-08-04 36 views
8

修訂數據存儲受修訂每個對象的方式獲得在_AUD表中單獨記錄完整Envers修訂。因此,當我搜索影響對象A的修訂時,我將返回修訂爲3的對象B的條目,但如果對象A和/或C也在修訂3中更改,則不會返回這些條目, B是該修訂版中修改的唯一對象。我想要做的是每個修訂都會影響對象B,返回受該修訂影響的所有對象。獲取其中的特定對象受到影響

 
something_AUD  desired  actual 

id|REV   id|REV  id|REV 
-------------  -------  ------ 
A|1    B|2   B|2 
B|2    B|3   B|3 
B|3    C|3 
C|3 

我一直在試圖通過運行初始查詢找到了相關的修訂要做到這一點:

AuditQuery query = AuditReaderFactory.get(entity.em()).createQuery() 
.forRevisionsOfEntity(type, false, true) 
.add(AuditEntity.id().eq(entity.id)); 

,然後運行下面的查詢爲每個結果:

int rev_id = ((RevisionData) data[1]).getId(); 
AuditQuery q = AuditReaderFactory.get(JPA.em()).createQuery() 
.forRevisionsOfEntity(type, false, true) 
.add(AuditEntity.revisionNumber().eq(rev_id)); 
List<Object[]> real_data = q.getResultList(); 

但這導致QuerySyntaxException

別名'r'的重複定義[select e,r,r from models.AgentShift_AUD e,models.RevisionData r,models.RevisionData r 其中e.originalId.REV.id in(:_p0)和e.originalId。 REV.id = r.id和 e.originalId.REV.id在(:_p1)和e.originalId.REV.id = r.id爲了通過 e.originalId.REV.id ASC,e.originalId.REV .id asc]

我已經嘗試過幾個變種,它們都導致了相同的「別名'r'的重複定義」。還有什麼我可以嘗試嗎?

+0

不知道你的意思是:「但是,如果其他實體也受這些修訂,這些條目不退換」。一個例子可以幫助你理解你想要達到的目標以及你面臨的問題。 –

+0

更新後添加:我不認爲你可以用envers api來做到這一點,你必須使用JPA,因爲你試圖從一個查詢中的多個表中進行查詢:http://ezingsoft.com/ ?p = 52 –

+0

實體'B'與實體'A'和'C'有一些關係嗎? – Naros

回答

0

這就是我到目前爲止所提出的。它不乾淨的解決方案,但它的工作原理:

AuditReader reader = AuditReaderFactory.get(entity.em()); 
AuditQuery query = reader.createQuery() 
.forRevisionsOfEntity(type, false, true) 
.add(AuditEntity.id().eq(entity.id)); 

List<Object[]> raw_results = query.getResultList(); 
List<Object[]> complete_results = new ArrayList<Object[]>(raw_results.size()); 

for (Object[] data : raw_results) { 
    int rev_id = ((RevisionData) data[1]).getId(); 
    AuditQuery q = reader.createQuery() 
    .forRevisionsOfEntity(type, false, true) 
    .add(AuditEntity.revisionNumber().eq(rev_id)); 
    List<Object[]> real_data = q.getResultList(); 
    complete_results.addAll(real_data); 
} 

希望有人會想出更好的辦法,尤其是一個可以做一個單一的查詢。

相關問題