NHibernate - 简单的连接查询

时间:2011-01-13 23:02:16

标签: nhibernate join

一个非常简单的场景。 我有2个类: 项目 DataStructure 。类 项目 包含成员列表< DataStructure >。 我的目标是在一次调用中加载项目及其所有DataStructures。

public class Project
{
    public virtual string Id { get { } set { } }
    public virtual string Name { get { } set { } }
    public virtual ISet<DataStructure> DataStructures { get { } set { } }
}

public class DataStructure
{
    public virtual string Id { get { } set { } }
    public virtual string Name { get { } set { } }
    public virtual string Description { get { } set { } }
    public virtual Project Project { get { } set { } }
    public virtual IList<DataField> Fields { get { } set { } }
}

请注意, DataStructure 还包含类 DataField 的列表,但我不想加载这些现在。

Fluent NHibernate中的映射:

public class ProjectMap : ClassMap<Project>
{
    public ProjectMap()
    {
        Table("PROJECTS");
        Id(x => x.Pk, "PK");
        Map(x => x.Id, "ID");
        Map(x => x.Name, "NAME");
        HasMany<DataStructure>(x => x.DataStructures).KeyColumn("FK_PROJECT");
    }
}

public class DataStructureMap : ClassMap<DataStructure>
{
    public DataStructureMap()
    {
        Table("DATA_STRUCTURES");
        Map(x => x.Id, "ID");
        Map(x => x.Name, "NAME");
        Map(x => x.Description, "DESCRIPTION");
        References<Project>(x => x.Project, "FK_PROJECT");
        HasMany<DataField>(x => x.Fields).KeyColumn("FK_DATA_STRUCTURE");
    }
}

这是我的疑问:

using (ISession session = SessionFactory.OpenSession())
{
    IQuery query = session.CreateQuery("from Project left join DataStructure");
    project = query.List<Project>();
}

结果是这个例外:

NHibernate.Hql.Ast.ANTLR.SemanticException: Path expected for join! [from Themis.DataEntities.Project left join DataStructure]

我是否需要为连接指定字段?这不是从映射中推断的吗?

注1 - 表 PROJECTS 包含一个 项目 行,因此无需搜索特定内容一。

注2 - 我通过成功加载 项目 来验证我的NHibernate设置是否正确。

2 个答案:

答案 0 :(得分:2)

对于任何有兴趣的人,我都找到了关于nhusers的答案:

IQuery query = session.CreateQuery("from Project as pr left join pr.DataStructures")

答案 1 :(得分:1)

您的查询应为"from Project left join Project.Fields"Project.DataStructures是NH希望看到的路径。请记住,它是面向对象的,而不是面向表的,所以大多数时候甚至你的查询都在对象上运行。