鉴于A类与一对多关系中的另一个B相关,如何创建一个NHibernate查询(使用Criteria API - 无HQL)来查找所有对象A“没有”相关对象B?具体细节如下,但我想首先提出问题。
我有两个模型类,样本和 SampleDiagnosis 。样本具有诊断属性,该属性是ISet< SampleDiagnosis>。 SampleDiagnosis有一个 Owner 属性,它链接回样本。这是一个简单的一对多关系。
我的Sample 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查询,该查询将匹配 Diagnoses 列表中没有任何项目的示例。这是我用来构建测试查询的代码:
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中使用集合的重要信息。
答案 0 :(得分:1)
通过HQL更容易 SO - 只是说':)
您尝试使用size
了吗?类似的东西:
var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );
答案 1 :(得分:1)
事实证明,我所寻找的是 Expression.IsEmpty(“诊断”)。