2009-05-03 10 views
2

まず、forum.hibernate.orgにアクセスしようとしている他の人。 私はしばらく試しています。それを信じることはできません。Nhibernate - WebアプリケーションにHasManyコレクションを持つエンティティをロードする

私はNHibernateを初めて使っています。簡単に行く。

私はMVCアプリケーションを持っており、レシピ と呼ばれるエンティティを持ち、HasManyコレクションのコメント、成分、 およびImagesを持っています。

MVCコントローラの動作では、最初の レシピをロードしてホームページにロードします。

私は以下のHQLを使用しています。 イメージを先読みして、最初のイメージを表示できるようにします。しかし私の最初の レシピは3つの画像を持っているので、 レシピの3つの行がクエリに表示されます。

 string sql = "from Recipe r " + 
      "left join fetch r.Images " + 
      "inner join fetch r.User " + 
      "where r.Completed!=0"; 
     IList<Recipe> recipes = (IList<Recipe>)session.CreateQuery(sql) 
      .SetMaxResults(20) 
      .List<Recipe>(); 

イメージがロードされた最初の20個のレシピを読み込むにはどのような方法を使用しますか? Iストレスレイジーロードではなく画像をプリフェッチしたいのですが、リストがコントローラアクションにロードされているため、ユーザーコントロールで列挙したときにイメージをロードできないためです。

マルコム

答えて

1

はこれを試してみてください:

string sql = "from Recipe r " + 
     "left join fetch r.Images " + 
     "inner join fetch r.User " + 
     "where r.Completed!=0"; 

var recipes = session 
    .CreateQuery(sql) 
    .SetResultTransformer(CriteriaUtil.DistinctRootEntity) 
    .SetMaxResults(20) 
    .List<Recipe>(); 
+0

あなたはこの作品か?私はそれがないと確信しています。行数を正しく取得できないような結合です。 (私は解決策はわかりません) – Rashack

+0

実際に動作します。ありがとう! – Malcolm

+0

重複した行は、左側の結合に由来します。 NHibernateは、DistinctRootEntityトランスフォーマが設定されている場合、Recipeモデルの主キーを使用して重複行をフィルタリングします。ただし、データベースレベルではなく行がフェッチされた後で、フィルタリングがメモリー内で行われることに注意してください。 –

関連する問題