Я делаю запрос для всех ревизий класса, которые больше, чем отметка времени, используя:
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, поскольку это слишком медленно. Это также можно ускорить, используя идентификатор прямо внутри подзапроса вместо ссылки на идентификатор таблицы запроса. У меня есть индексы DTYPE
, REV
и REVTYPE
и уникальный ключ для идентификатора REV
, так что это не проблема с индексированием.
Я не уверен, почему он использует приведенный выше запрос для воссоздания ссылочного объекта, и был бы признателен за любую информацию. Это в базе данных MySQL 5.1 на компьютере с процессором Pentium 4, но на двухъядерном компьютере это также занимает значительное время.