如何使用NHibernate查询外键列,而不检索相关实体

时间:2012-01-10 16:56:54

标签: nhibernate nhibernate-criteria

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

Child没有ParentId属性。它确实有Parent属性。

所以,Child的NHibernate映射包括:

<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(如here所述),但是一位朋友/同事让我觉得必须有更好的方法。

有什么想法吗?有投影的内容和Restrictions.EqProperty

3 个答案:

答案 0 :(得分:6)

您必须为关联路径设置别名。这将返回Parent的代理,假设使用延迟加载。您可以访问父级的Id属性而不会触发加载。

return _session.CreateCriteria<Child>()
    .CreateAlias("Parent", "parent")
    .Add(Restrictions.Eq("parent.Id", parentId))
    .List<Child>();

答案 1 :(得分:5)

我已经使用查询完成了此操作。这是一个例子:

Child foundChild = 
    session.QueryOver<Child>()
        .Where(x => x.Parent.Id == 1234).SingleOrDefault<Child>();

答案 2 :(得分:0)

我认为可以通过Criteria这样做:

criteria.Add(Restrictions.Eq("Parent", Session.Load<Parent>(1));