给定一个与另一个B类在一对多关系中相关的类A,如何创建一个NHibernate查询(使用Criteria API - 无HQL)来查找所有对象“谁没有”相关对象B?具体细节如下,但我想先把问题提出来。使用ISet的NHibernate ICriteria子查询<T>属性:这是正确的吗?
我有两个模型类,样品和SampleDiagnosis。样品有诊断属性是ISet <SampleDiagnosis>。 SampleDiagnosis有一个所有者属性,链接回样本。这是一个简单的一对多关系。
我的样本的NHibernate映射文件的相关部分如下所示:
<set name="Diagnoses" table="sample_diagnoses" cascade="all-delete-orphan" inverse="true">
<key column="sample_id" />
<one-to-many class="SampleDiagnosis" />
</set>
相关一块SampleDiagnosis映射文件看起来是这样的:
<many-to-one name="Owner" class="Sample" column="sample_id" />
我想创建一个NHibernate的ICriteria查询将匹配其诊断列表中没有任何项目的样本。下面是我使用建立我的测试查询代码:
var dc = DetachedCriteria.For<Sample>();
var subcriteria = dc.CreateCriteria("Diagnoses").SetProjection(Projections.RowCount());
dc.Add(Subqueries.Eq(0, subcriteria));
在我的脑海里,这个生成的SQL看起来像下面这样:
SELECT * FROM samples WHERE (select count(*) from sample_diagnoses where sample_diagnoses.sample_id = samples.sample_id) = 0
然而,实际上做了GetExecutableCriteria时()和List()结果,我的代码崩溃。硬。没有任何例外情况发生,但无论发生什么事,运行代码(无论是NUnit还是w3p.exe)都会死亡。我已经在多台机器上尝试过了,所有结果都一样。我有一种感觉,我错过了关于子查询在NHibernate中如何工作的关键。只是说:)
你尝试使用size
-
不幸的是,SizeEq是Hibernate的一部分,但不是NHibernate!)。但是,您的确激励我回顾并更仔细地检查API,而Expression.IsEmpty(“诊断”)确实可行。 – Matt 2009-08-03 03:43:39