给定一个类 A 与另一个类 B 以一对多关系相关,您如何创建 NHibernate 查询(使用 Criteria API--no HQL)来查找“没有”相关对象 B 的所有对象 A ? 具体如下,但我想先解决这个问题。
我有两个模型类,Sample和SampleDiagnosis。Sample 有一个Diagnoses属性,它是一个 ISet<SampleDiagnosis>。SampleDiagnosis 有一个Owner属性,它链接回样本。这是一个简单的一对多关系。
我的示例 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 中的集合一起工作的重要信息。