【问题标题】:NHibernate ICriteria subqueries with ISet<T> properties: Is this correct?具有 ISet<T> 属性的 NHibernate ICriteria 子查询:这是正确的吗?
【发布时间】:2009-08-02 23:35:11
【问题描述】:

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

我有两个模型类,SampleSampleDiagnosis。 Sample 有一个 Diagnoses 属性,它是一个 ISet。 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 中的集合一起工作的一些重要信息。

【问题讨论】:

    标签: c# .net nhibernate criteria subquery


    【解决方案1】:

    这会SO通过 HQL 更容易 - 只是说':)

    您是否尝试过使用size?类似的东西:

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

    【讨论】:

    • 不幸的是,SizeEq 是 Hibernate 的一部分,但不是 NHibernate!)。但是,您确实激励我回去更仔细地检查 API,并且 Expression.IsEmpty("Diagnoses") 确实有效。
    • 确实,我学会了使用 Hibernate 的技巧 :-) 我知道 size 函数在 NHibernate HQL 中有效,但不确定标准。很高兴你想通了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多