Nhibernate查询与null子

时间:2016-11-17 12:03:53

标签: nhibernate nhibernate-criteria

我需要检索具有有效Wish属性的所有用户(因此不为null)。这是我班级的xml:

<class name="Project.Engine.Domain.User,Project.Engine" table="Users" lazy="true">
  <id name="UserID" column="UserID">
    <generator class="native" />
  </id>
  <property name="Firstname" column="Firstname" type="string" not-null="true"
    length="255" />
  <property name="Lastname" column="Lastname" type="string" not-null="true"
    length="255" />
  <property name="Email" column="Email" type="string" not-null="true"
    length="255" />
  <one-to-one name="Wish" cascade="all" property-ref="UserID"
    class="Project.Engine.Domain.Wish, Project.Engine"  />
</class>

获取所有用户的方法如下:

public PagedList<User> GetAll(int pageIndex, int pageSize,
    string orderBy, string orderByAscOrDesc)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        var users = session.CreateCriteria(typeof(User));
        users.Add(Restrictions.IsNotNull("Wish"));
        return users.PagedList<User>(session, pageIndex, pageSize);
    }
}

您可以注意到,我在子对象上添加了限制。这不能正常工作,因为该方法将所有用户(包括Wish属性的用户返回为null)。有什么帮助吗?

这是孩子的xml:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Project.Engine.Domain.Wish,Project.Engine" table="Wish" lazy="false">
    <id name="WishID" column="WishID">
      <generator class="native" />
    </id>
    <property name="UserID" column="UserID" type="int" not-null="true" length="32" />
    <property name="ContentText" column="ContentText" type="string" not-null="false" length="500" />
    <property name="Views" column="Views" type="int" not-null="true" length="32" />
    <property name="DateEntry" column="DateEntry" type="datetime" not-null="true" />
  </class>
</hibernate-mapping>   

2 个答案:

答案 0 :(得分:1)

嗯,one-to-onenull测试可能不存在的方面存在错误。我已经遇到过但忘记了。 property-ref只是让它更难以诊断,但它确实存在于实际的one-to-one上。

以下是NHibernate跟踪工具中的相应issue

解决方法:测试null的非可空属性的Wish状态,例如Wish.Views

原谅对测试语法的猜测,我不再使用多年了,但请尝试示例:

public PagedList<User> GetAll(int pageIndex, int pageSize,
    string orderBy, string orderByAscOrDesc)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        var users = session.CreateCriteria(typeof(User));
        users.Add(Restrictions.IsNotNull("Wish.Views"));
        return users.PagedList<User>(session, pageIndex, pageSize);
    }
}

使用,我确认此解决方法适用于我自己的项目,例如:

// The "TotalAmount != null" seems to never be able to come false from a 
// .Net run-time view, but converted to SQL, yes it can, if TransactionRecord
// does not exist.
// Beware, we may try "o.TransactionsRecord != null", but you would get struck
// by https://nhibernate.jira.com/browse/NH-3117 bug.
return q.Where(o => o.TransactionsRecord.TotalAmount != null);

我保留了我的其他答案,因为您可能会考虑使用many-to-one,尤其是因为您没有进行双向映射({1}}中没有相应的constrained one-to-one )除了没有实际的Wishone-to-one不会受到这个错误的影响。

答案 1 :(得分:0)

使用one-to-one

property-ref映射不是&#34;实际&#34;一对一,通常这是一个标志,应该使用many-to-one映射 也许这与你的麻烦无关,但你可以尝试一下。

&#34;实际&#34;一对一使从属表主键等于父表主键。 (在您的情况下,依赖表格Wish将有一个外国主键,UserId在您的情况下。请参阅此example。)

我有时间&#34;播放&#34;与&#39;一对一的财产 - 参考&#39;,由于许多问题我总是放弃它。我用更经典的映射替换了它,要么改变我的数据库以实现一对一,要么使用多对一和生活在子端的集合,尽管它总是包含单个元素。