4

と の 2 つのクラスがあるParentとしChildます。AParentにはプロパティChildrenがあり、これはもちろんChildオブジェクトのコレクションです。

ChildParentIdプロパティを持っていません。それはParentプロパティを持っています。

したがって、私の NHibernate マッピングにChildは以下が含まれます。

<many-to-one name="Parent" class="Parent" column="ParentId" cascade="save-update" />

そして私のParentマッピングには以下が含まれます:

<bag name="children" access="field" inverse="true" cascade="all-delete-orphan">
    <key column="ParentId" />
    <one-to-many class="Child" />
</bag>

ここで私がやりたいことは次のとおりです。Child特定の を持つすべてのオブジェクトを取得したいParentIdParent最初に を取得してから、そのChildrenプロパティを返すことができることを知っています。Childしかし、テーブルを直接クエリしたい場合はどうすればよいでしょうか?

マップされたプロパティ (たとえば、Name) である場合、NHibernate の基準を使用できますが、この場合ParentIdはマップされません。

私は次のようなものを使ってみました:

criteria.Add(Restrictions.Eq("Parent.Id", 1));

しかし、それはうまくいきません。私はSQLCriterionを使用することに頼りました(ここで説明されているように)が、友人/同僚が私にもっと良い方法があるに違いないと考えさせました。

何か案は?突起のあるものとRestrictions.EqProperty?

4

3 に答える 3

6

アソシエーションパスのエイリアスを作成する必要があります。これにより、遅延読み込みを使用していると想定して、Parentのプロキシが返されます。ロードをトリガーせずに、親のIdプロパティにアクセスできます。

return _session.CreateCriteria<Child>()
    .CreateAlias("Parent", "parent")
    .Add(Restrictions.Eq("parent.Id", parentId))
    .List<Child>();
于 2012-01-10T18:57:32.513 に答える
5

私はクエリオーバーを使用してこれを行いました。次に例を示します。

Child foundChild = 
    session.QueryOver<Child>()
        .Where(x => x.Parent.Id == 1234).SingleOrDefault<Child>();
于 2012-01-10T18:10:51.850 に答える
0

次のような基準を介して実行できると思います。

criteria.Add(Restrictions.Eq("Parent", Session.Load<Parent>(1));
于 2012-01-10T18:29:31.237 に答える