2009-08-02 21 views
1

给定一个与另一个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 -

回答

1

原来,我一直在寻找的是Expression.IsEmpty( “诊断”)

1

这将通过HQL是SO容易得多?喜欢的东西:

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

不幸的是,SizeEq是Hibernate的一部分,但不是NHibernate!)。但是,您的确激励我回顾并更仔细地检查API,而Expression.IsEmpty(“诊断”)确实可行。 – Matt 2009-08-03 03:43:39

相关问题