2
我做了使用比時間戳大的類的所有版本的查詢:forRevisionsOfEntity緩慢
AuditReaderFactory
.get(emf.createEntityManager())
.createQuery().forRevisionsOfEntity(clazz, false, true)
.add(AuditEntity.revisionProperty("timestamp").gt(existingIndex.lastModified()))
.getResultList();
這可以通過查詢再造一個@ManyToOne
引用的對象:
select <audit cols for this type>
from <audit table>
where DTYPE IN (<class type>)
and REV=(
SELECT max(REV)
FROM <audit table>
where TYPE IN (<class type>)
and REV <= <maximum revision in revision entity table>
and <subquery>.id=<query>.id
)
and REVTYPE<>2
AND <audit table>.id=<id of entity being restored>
這個查詢速度非常慢,僅僅爲一個實體花了超過100分鐘(實際上,因爲我正在寫它,它仍然會繼續)。爲什麼它獲得實體的最後修訂(減去DEL修訂版)?使用ORDER BY REV LIMIT 1
(或不具有LIMIT
的數據庫)的速度要快得多。我幾乎想要直接去SQL,因爲這太慢了。它也可以通過直接在子查詢中使用id而不是引用查詢的表id來加快速度。我有索引DTYPE
,REV
和REVTYPE
,以及唯一的密鑰ID,REV
因此它不是一個索引問題。
我不確定爲什麼它使用上面的查詢來重新創建引用的對象,並會感謝任何見解。這是在Pentium 4機器上的MySQL 5.1數據庫上,但是在雙核機器上也需要相當長的時間。