NHibernate:检索非空一对一关联类的条件表达式

Posted

技术标签:

【中文标题】NHibernate:检索非空一对一关联类的条件表达式【英文标题】:NHibernate: Criteria expression to retrieve non-null one-to-one associated class 【发布时间】:2008-11-19 18:57:49 【问题描述】:

我有两个与一对一映射相关的类:

<class name="Employee" table="Employees">
  ...
  <one-to-one name="Address" class="AddressInfo">
  ...
</class>

我想使用条件表达式仅获取关联地址类不为空的员工,类似这样(我知道这不起作用):

IList employeesWithAddresses = sess.CreateCriteria(typeof(Employee))
    .Add( Expression.IsNotNull("Address") )
    .List();

我想这是一个非常困难的问题,或者几乎没有人尝试过这样做?

【问题讨论】:

这里是同事,还有一些额外的信息。此查询不会产生错误或任何东西。它只返回结果而不过滤掉地址为空的结果。结果集包含 Address 的值为 null 和非 null 值的条目。 【参考方案1】:

您是否尝试过为 Address 属性创建别名并检查 Address 的 ID/主键是否不为空?

类似:

IList employeesWithAddresses = sess.CreateCriteria(typeof(Employee))
    .CreateCriteria("Address", "address").Add( Expression.IsNotNull("Id") )
    .List();

【讨论】:

【参考方案2】:

要隐式触发一对一的别名/联接,您不应该使用点符号吗?然后检查您的地址类中的任何字段:

IList employeesWithAddresses = sess.CreateCriteria(typeof(Employee))
    .Add( Expression.IsNotNull("Address.Id") )
    .List();

这可能与 Kareena 的方法相同,但我相信这等于 .CreateAlias()。使用 CreateAlias,您可以指定 FetchMode(使用的连接类型),但由于您想要具有相应地址的行,所以这不应该是必要的(因为 INNER 是默认值)。也不应该检查它是否为空。

IList employeesWithAddresses = sess.CreateCriteria(typeof(Employee))
    .CreateAlias("Address")
    .List();

【讨论】:

以上是关于NHibernate:检索非空一对一关联类的条件表达式的主要内容,如果未能解决你的问题,请参考以下文章

nhibernate,检索表中的最新行

NHibernate 级联删除不适用于一对多关联

NHibernate教程(11)--多对多关联查询

插入时 NHibernate 组件非空属性

如何使用 NHibernate 检索具有列表条件的元素

NHibernate 多对一多次获取相同的项目