0

我有一个与标签类具有多对多关系的入口类。我正在尝试恢复条目的历史副本。

我试过这样查询:

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属性 orentryRevision时,出现错误:

NHibernate.LazyInitializationException : Initializing[Unavailable#] - 无法延迟初始化集合,没有会话或会话关闭

当我尝试访问标签时,我已确认会话仍处于打开状态。

我想通过Tag_Entry_AUD直接查询表以获取可能曾经与此条目相关联的所有标签 ID 来解决此问题,但我不知道该怎么做?是否可以使用 HQL 查询来做到这一点?

4

1 回答 1

0

我能够得到一些工作:

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();

这给出了标签 Id 的列表,这些标签是或曾经与条目相关联的某个点。

编辑:

以上作为一个 HQL 查询(正如 Roger 指出的那样,上面的代码将加载整个 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();
于 2015-05-06T18:18:26.153 回答