質問

どのように私はのcreateCriteriaを使用して、次のSQLを書くことができます:

SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id)
役に立ちましたか?

解決 3

私はIsNotEmpty式を使用して、これを行う方法を働きました。ここでは、NHibernateはラムダ拡張機能を使用しています:

Session.CreateCriteria<FooBar>()
    .Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes))
    .List<FooBar>();

他のヒント

ここであなたがそれを行うことができる方法です。

var fooBars = Session.CreateCriteria<FooBar>()
        .Add(Restrictions.IsNotEmpty("Bazs")).List<FooBar>();

... FooBarのオブジェクトのコレクションプロパティ(1対多)「Bazs」がされると仮定します。

別の方法としては、そのような一戸建ての基準を使用することができます:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
        .SetProjection(Projections.Property("baz.FooBarId"))
        .Add(Restrictions.EqProperty("baz.FooBarId", "fooBar.Id"));

var fooBars = Session.CreateCriteria<FooBar>("fooBar")
        .Add(Subqueries.Exists(dCriteria)).List<FooBar>();

ちょうど関連の問題を解決し、最終的に私はここで答えを共有したいと思ったソリューションに到着しました。

サブクエリの追加の条件で、あなたは、元の質問の問い合わせをしたいと仮定すると、

SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id
              AND Quantity = 5)

と呼ばれる、あなたは親にバズクラスの参照を持っていると仮定すると、以下のようにFooBarRefは、クエリを作成し、[流暢Mapクラスで使用すると、参考文献()メソッドを使用したい]と言うます:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
        .SetProjection(Projections.Property("baz.FooBarId"))
        .Add(Expression.EqProperty("this.FooBarId", "FooBarRef.Id"))
        .Add(Expression.Eq("baz.Quantity", 5));

var fooBars = Session.CreateCriteria<FooBar>("fooBar")
        .Add(Subqueries.Exists(dCriteria)).List<FooBar>();

私はNHibernateは、自動的にクエリ内のルートエンティティ(テーブル)に割り当てる別名である別名「これ」、のハードコーディング約100%確信していないが、それは私が参照するために見つけた唯一の方法ですサブクエリ内から親クエリのテーブルのキーます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top