1

给定一个类 A 与另一个类 B 以一对多关系相关,您如何创建 NHibernate 查询(使用 Criteria API--no HQL)来查找“没有”相关对象 B 的所有对象 A ? 具体如下,但我想先解决这个问题。

我有两个模型类,SampleSampleDiagnosis。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 中的集合一起工作的重要信息。

4

2 回答 2

1

通过HQL这会容易得多 - 只是说':)

你试过用size吗?就像是:

var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );
于 2009-08-03T01:47:55.770 回答
1

原来,我正在寻找的是Expression.IsEmpty("Diagnoses")

于 2009-08-03T15:03:11.483 回答