2009-08-02 9 views
1

1対多の関係で別のクラスBに関連するクラスAが与えられている場合、関連するクラスの「持っていない」すべてのオブジェクトAを見つけるために、Hibernateクエリを作成するにはどうすればいいですか?オブジェクトB?具体的なことが続きますが、最初に質問を出したいと思っていました。ISet <T>プロパティを持つNHibernate ICriteriaサブクエリ:これは正しいですか?

サンプルサンプルの診断です。サンプルには診断プロパティがあり、ISet <SampleDiagnosis>です。 SampleDiagnosisにはオーナープロパティがあり、サンプルにリンクしています。それは単純な一対多の関係です。

私のサンプルNHibernateのマッピングファイルの該当するセクション次のようになります。SampleDiagnosisマッピングファイルの関連部分はこのようになります

<set name="Diagnoses" table="sample_diagnoses" cascade="all-delete-orphan" inverse="true"> 
    <key column="sample_id" /> 
    <one-to-many class="SampleDiagnosis" /> 
</set> 

<many-to-one name="Owner" class="Sample" column="sample_id" /> 

私はNHibernateはを作成しようとしています診断リストに項目がないサンプルと一致するICriteriaクエリ。実際GetExecutableCriteriaを行うときに、しかし

SELECT * FROM samples WHERE (select count(*) from sample_diagnoses where sample_diagnoses.sample_id = samples.sample_id) = 0 

:ここで私は私のテストクエリ構築するために使用していたコードです:私の心の中で

var dc = DetachedCriteria.For<Sample>(); 

var subcriteria = dc.CreateCriteria("Diagnoses").SetProjection(Projections.RowCount()); 

dc.Add(Subqueries.Eq(0, subcriteria)); 

は、このために生成されたSQLは、次のようになります。 ()とList()を実行すると、コードがクラッシュします。ハード。例外はスローされませんが、コードが実行されたときには(NUnitまたはw3p.exeのいずれでも)、ひどい死があります。私は同じ結果を持つ複数のマシンで試しました。私は、サブクエリがNHibernateのセットでどのように機能するかについて、何かが欠けていると感じています。

答えて

1

私が探していたものを、めくりはExpression.IsEmpty( "診断し")であった

1

これはHQL経由SOずっと容易になるだろう - ちょうどコト:)

をおsizeを使用してみましたか?以下のような何か:

var dc = DetachedCriteria.For<Sample>(); 
dc.Add(Expression.sizeEq("Diagnoses", 0)); 
+0

残念ながら、SizeEqはHibernateの一部ですが、NHibernateではありません!)。しかし、あなたは私に戻ってAPIを詳しく調べるよう促してくれました。Expression.IsEmpty( "Diagnoses")は機能しています。 – Matt

+0

確かに、私はHibernateを使ってそのトリックを取り上げました:-) 'size'関数はNHibernate HQLで動作するが、基準についてはわからないという事実を知っていました。あなたがそれを理解してうれしいです。 – ChssPly76

関連する問題