【问题标题】:NHibernate - simple join queryNHibernate - 简单的连接查询
【发布时间】:2011-01-13 23:02:16
【问题描述】:

一个非常简单的场景。 我有 2 个类:Project 和 DataStructure。 Project 类包含成员 ListDataStructure>。 我的目标是在一次调用中加载一个项目及其所有数据结构。

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 包含单个 Project 行,因此无需搜索特定的一。

注意 2 – 我通过仅成功加载 Project 验证了我的 NHibernate 设置是正确的。

【问题讨论】:

    标签: nhibernate join


    【解决方案1】:

    对于任何感兴趣的人,我在 nhusers 上找到了答案:

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

    【讨论】:

      【解决方案2】:

      您的查询应该是"from Project left join Project.Fields"。 Project.DataStructures 是 NH 期望看到的路径。请记住,它是面向对象的,而不是面向表的,因此大多数情况下,即使您的查询也对对象进行操作。

      【讨论】:

      • 好答案,但我认为您的意思是 Project.DataStructures,如果我有代表,我会为您纠正。
      • 我将查询改为 IQuery query = session.CreateQuery("from Project left join Project.DataStructures");现在我得到一个稍微不同的错误:NHibernate.Hql.Ast.ANTLR.InvalidPathException: Invalid path: 'Project.DataStructures' [from Themis.DataEntities.Project left join Project.DataStructures]
      • 尝试为 Project.DataStructures 指定命名空间,例如 Themis.DataEntities.Project.DataStructures
      猜你喜欢
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多