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プロパティまたはにアクセスしようとするentryRevisionと、エラーが発生します。

NHibernate.LazyInitializationException : Initializing[Unavailable#] - コレクションの遅延初期化に失敗しました。セッションまたはセッションが閉じられませんでした

タグにアクセスしようとすると、セッションがまだ開いていることを確認しました。

テーブルを直接クエリして、このエントリに関連付けられていた可能性のあるすべてのタグ ID を取得することで、この問題を回避したいとTag_Entry_AUD考えていますが、方法がわかりません。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 のリストが得られます。

編集:

上記は 1 つの 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 に答える