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:检索非空一对一关联类的条件表达式的主要内容,如果未能解决你的问题,请参考以下文章