1

私は持っており、エンティティはそれを呼び出すことができEntityChildコレクションがありChildrenます。ユーザーがEntity情報を持っている画面とコレクションのリストがありChildrenますが、そのコレクションは非常に大きくなる可能性があるため、ページングの使用を考えていました:最初の20要素を取得し、ユーザーが次の場合にのみ遅延ロードします次のボタンを明示的に押します。

だから私はエンティティリポジトリでこの署名を持つ関数を作成しました:

IEnumerable<Child> GetChildren(Entity entity, int actualPage, int numberOfRecordsPerPage)

Aggregate ルート エンティティではなく、子コレクションで setfirstresult と setmaxresult を使用する必要があります。しかし、これら 2 つの構成を使用すると、常に HQL/Criteria クエリのエンティティ タイプを参照します。

他の代替手段は、タイプの HQL/Criteria クエリを作成しChild、最大値と最初の結果を設定してから、Entity Children コレクションにあるものを (サブクエリを使用して) フィルター処理することです。しかし、私はこのフィルターを行うことができませんでした。双方向の関連付け (親エンティティを参照する子) である場合は、より簡単になります。

助言がありますか?

どれでも

4

2 に答える 2

0

1つのアプローチは、group byを実行して、両方のテーブルから結果を返すクエリを作成することです。このアプローチでは、開始点(Entityオブジェクト)を維持しながら、子コレクションから取得され、共通の要素(各行のエンティティのID)を持つデータにページングを適用できます。私が言いたいのはそのようなものです:

public IList<object> GetData(int entityID, int actualPage, int numberOfRecordsPerPage)
        {
            ICriteria criteria = _repository.Session.CreateCriteria<FlowWhatIfProfile>("entity")
                .CreateCriteria("Children", "children", NHibernate.SqlCommand.JoinType.InnerJoin)
                .Add(Restrictions.Eq("children.EntityID", entityID));           

            ProjectionList pl = Projections.ProjectionList();
            pl.Add(Projections.GroupProperty("children.Id"));
            pl.Add(Projections.GroupProperty("children.Property1"));
            pl.Add(Projections.GroupProperty("children.Property2"));
            pl.Add(Projections.GroupProperty("children.Property2"));
            pl.Add(Projections.GroupProperty("entity.Id"));

            return criteria.SetProjection(pl)
                .SetFirstResult(actualPage * numberOfRecordsPerPage)
                .SetFetchSize(numberOfRecordsPerPage)
                .List<object>();
        }

欠点は、返されるデータが配列のリストであるということです(にキャストobjectする必要がありobject[]ます)が、NHibernateがこれらの配列を定義した厳密に型指定されたオブジェクトに投影しないようにするAliasToBean機能を使用することでそれを克服できます。

于 2010-03-17T18:26:59.487 に答える
0

CreateFilter で簡単です

session.CreateFilter(entity.children, "")
    .SetFirstResult(0)
    .SetMaxResults(20)
    .List();

http://knol.google.com/k/fabio-maulo/nhibernate-chapter-16/1nr4enxv3dpeq/19#

于 2010-03-20T01:46:47.890 に答える