2011-01-13 22 views
2

非常に簡単なシナリオです。 プロジェクトデータ構造: は、私は2つのクラスを持っています。クラスプロジェクトは、データ構造 < メンバーのリストが含まれています>。 私の目標は、プロジェクトとそのすべてのデータ構造を1回の呼び出しで読み込むことです。NHibernate - 単純な結合クエリ

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 { } } 
} 

データ構造もクラスのDataFieldのリストが含まれていますが、私は今、これらの権利をロードしないこと。流暢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] 

は私がのためにフィールドを指定する必要がありますか参加しますか?マッピングからは推測されていませんか?

注 - 特定のものを検索する必要がないので、表PROJECTS単一プロジェクト行を含んでいます。

注2 - 私はNHibernateのセットアップが正常にちょうどプロジェクトをロードすることによって、正しいことを確認しました。

答えて

2

私はnhusersの答えが見つかりました:

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

クエリは"from Project left join Project.Fields"である必要があります。 Project.DataStructuresはNHが見たいと思うパスです。テーブル指向ではなく、オブジェクト指向であることを覚えておいてください。ほとんどの場合、クエリーさえもオブジェクト上で動作します。興味がある人のため

+0

良い答えを、私はあなたが私が担当していた場合、私はあなたのための修正でしょう 'Project.DataStructures'を意味すると思います。 – ChrisAnnODell

+0

あなたは正しいです。 –

+0

IQuery query = session.CreateQuery( "Project left join Project.DataStructures")にクエリを変更しました。今度は少し違うエラーが出ます:NHibernate.Hql.Ast.ANTLR.InvalidPathException:無効なパス: 'Project.DataStructures' [Themis.DataEntities.Projectから継承Project.DataStructures] – Yoav

関連する問題