4

假设我有两个课程:ParentChild. AParent有一个属性Children,它当然是Child对象的集合。

Child没有ParentId财产。它确实有一个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具有特定ParentId. 我知道我可以先获取Parent然后返回它的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 回答