3

投稿とタグの間に多対多の関係 (ActiveRecord 属性 HasAndBelongsToMany を使用) があるとしましょう (無実を保護するためにドメイン オブジェクト名が変更されています)。次のようなメソッドが必要でした。

FindAllPostByTags(IList<Tag> タグ)
これは、パラメータ内のすべての (一部だけでなく) タグを持つすべての投稿を返します。NHibernate Expressions または HQL を使用してこれを達成する方法はありますか? HQL のドキュメントを検索しましたが、自分のニーズに合ったものが見つかりませんでした。明らかな何かが欠けていることを願っています!

4

3 に答える 3

2

INステートメントを使用することもできます

DetachedCriteria query = DetachedCriteria.For<Post>();
query.CreateCriteria("Post").Add(Expression.In("TagName",  string.Join(",",tags.ToArray()) );

私はそれをコンパイルしていないので、エラーが発生する可能性があります

于 2008-10-02T10:41:41.527 に答える
0

現在、Castleがインストールされているシステムが手元にないため、これをテストまたはコンパイルしませんでしたが、以下のコードは、必要な処理を実行するはずです。

Junction c = Expression.Conjunction();
foreach(Tag t in tags)
    c = c.Add( Expression.Eq("Tag", t);

return sess.CreateCriteria(typeof(Post)).Add(c).List();
于 2008-09-24T22:33:23.670 に答える
0

同じ問題が発生し、HQLドキュメントを読み込もうとしましたが、一部の機能がNHibernateに実装されていないようです(たとえば、キーワード付き)

私はこの種の解決策に行き着きました:

pを選択
投稿pから
JOIN p.Tags tag1
JOIN p.Tags tag2
どこ
    tag1.Id = 1
    tag2.Id = 2

つまり、タグごとに結合を使用してHQLを動的に構築してから、WHERE句で選択を行います。これは私のために働いた。DetachedCriteriaで同じことをしようとしましたが、テーブルに複数回参加しようとすると問題が発生しました。

于 2008-11-06T14:53:03.273 に答える