如何查询具有多对多关系的审计 table
How to query audit table with many-to-many relationship
我有一个条目 class 与标签 class 具有多对多关系。我正在尝试恢复条目的历史副本。
我试过这样查询:
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#]-failed to lazily initialize a collection, no session or session was closed
我已确认当我尝试访问标签时会话仍然打开。
我想通过直接查询 Tag_Entry_AUD
table 来解决这个问题,以获取可能曾经与此条目相关联的所有标签 ID,但我不确定如何?是否可以使用 HQL 查询来执行此操作?
我能够得到一些东西:
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 table... 可能需要避免的事情):
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();
我有一个条目 class 与标签 class 具有多对多关系。我正在尝试恢复条目的历史副本。
我试过这样查询:
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#]-failed to lazily initialize a collection, no session or session was closed
我已确认当我尝试访问标签时会话仍然打开。
我想通过直接查询 Tag_Entry_AUD
table 来解决这个问题,以获取可能曾经与此条目相关联的所有标签 ID,但我不确定如何?是否可以使用 HQL 查询来执行此操作?
我能够得到一些东西:
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 table... 可能需要避免的事情):
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();