Как запросить таблицу аудита с отношением "многие ко многим"

У меня есть класс входа с отношением многие ко многим с классом тегов. Я пытаюсь восстановить историческую копию записи.

Я пытался сделать запрос так:

AuditReader reader = AuditReaderFactory.get(getEm());
var entryRevision = reader.createQuery()
    .ForEntitiesAtRevision(typeof(IEntry), false, true)
    .Add(new IdentifierEqAuditExpression(entryId, true))
    .Add(AuditEntity.RevisionNumber().Eq(revisionNumber)))
    .GetResultList().SingleOrDefault();

Тем не менее, при попытке получить доступ к Tags собственность или entryRevisionЯ получаю ошибку:

NHibernate.LazyInitializationException: Initializing [Unavailable #] - не удалось лениво инициализировать коллекцию, ни один сеанс или сеанс не был закрыт

Я подтвердил, что сеанс все еще открыт, когда я пытаюсь получить доступ к тегам.

Я хотел бы обойти это путем запроса Tag_Entry_AUD таблицу, чтобы получить все идентификаторы тегов, которые когда-то были связаны с этой записью, но я не уверен, как это сделать? Можно ли сделать это с помощью запроса HQL?

1 ответ

Решение

Я смог заставить что-то работать:

const string hql = "from Tag_Entry_AUD tc";
var associatedTagIds = reader.CreateQuery(hql).List<Hashtable>()
    .Select(t => t["originalId"] as Hashtable)
    .Where(tc => (Guid) tc["Entry_Id"] == entryId && ((RevisionHistory)tc["REV"]).RevisionNumber <= revisionNumber)
    .Select(tc => (Guid) tc["Tags_Id"])
    .ToList();

Это дает список идентификаторов тегов, которые являются тегами, которые были или были в какой-то момент связаны с записью.

РЕДАКТИРОВАТЬ:

Выше, как один запрос HQL (как указал Роджер, приведенный выше код будет загружать всю таблицу Tag_entry_AUD... вероятно, что-то, чтобы избежать):

const string hql = "SELECT originalId.Tags_Id " +
    "FROM Tag_Entry_AUD te " +
    "WHERE te.originalId.Entry_Id = :id " +
    "AND te.originalId.REV = :revNo";

SimpleQuery<Guid> q = new SimpleQuery<Guid>(hql);
q.SetParameter("id", entryId);
q.SetParameter("revNo", revisionNumber);
var associatedTagIds = q.Execute().ToList();
Другие вопросы по тегам