【问题标题】:NHibernate 2.0.1 Criteria: IsNull restriction throwing exceptionNHibernate 2.0.1 标准:IsNull 限制抛出异常
【发布时间】:2008-11-16 03:24:27
【问题描述】:

我一直在所有当前的 .NET 3.5 SP1 项目中使用NHibernate 2.0.1.4000,并且在使用任何其他查询(使用查询或条件 API)时都没有遇到任何问题,直到一些新的业务逻辑决定了新查询的必要性在这个针对应用程序数据库的特定项目中,该数据库需要从单个表中检索具有特定空属性(DateTime 类型)的记录。

知道您不能对此类查询使用不等于限制,而是可以使用 IsNull 限制,这个简单的查询会生成“值不能为空!”执行时异常。我有大量的 DEBUG 模式 log4net 日志文件,我已经查看过但还没有帮助,并且我已经验证我的表类确实指定了我正在检查的属性是一个可为空的属性(DateTime?)以避免强制更新记录等可能导致的问题,这里没有发生......

这是查询,没什么复杂的,我已经尝试使用/不使用 MaxResults 附加限制来消除它作为一个问题,但是,每次在我收集结果之前都会抛出异常:

ICriteria criteria = session.GetISession().CreateCriteria(typeof (Order)).Add(NHibernate.Criterion.Restrictions.IsNull("ShippedOn")).SetMaxResults(10);

IList<Order> entityList = criteria.List<Order>();

有任何想法或指向更多信息可以帮助我解决这个问题吗?我也尝试过使用 HQL,同样的问题......我在这里是否遗漏了一些关于返回具有特定 null 属性的记录的内容?

【问题讨论】:

    标签: nhibernate exception criteria


    【解决方案1】:

    快速更新......但经过进一步调查后发现,当事务和工作单元完成时,Expection 实际上被抛出,并且会话 .Flush() 方法被调用,并且再次以某种方式与如何NHibernate 尝试处理可为空的表字段/DAO 属性。即使我已经在我的课程中处理并映射了适用的表,但我的限制条件正在生成的实际 SQL 会导致异常在 Flush 上由 SqlDateTime 问题引发......

    目前,我的解决方法是从我的第一个限制中检索记录,并在代码中而不是查询中处理 IsNull 检查。性能不高,但在我弄清楚之前,它正在工作......

    【讨论】:

      【解决方案2】:

      .net 中的日期时间不能为空。您是否尝试过更改域模型以使用 DateTime?哪个可以为空?

      您可以使用条件查询获得类似的异常。假设我有一个 Person 域对象,其中包含一个名为 Name 的字符串属性。我可以构建以下标准:

      ICriteria criteria = session.CreateCriteria(typeof(Person)
      .Add(Restrictions.Eq(1234))
      

      但是我是否列出了这个条件 NHibernate 会抛出一个类型不匹配异常,因为我正在针对一个 int 测试一个字符串。 NHIbernate 在幕后对映射的对象进行了一些巧妙的反射类型检查,如果类型不对齐,则会抛出异常。 (如果不是这么聪明,你可能会得到一个 SqlException)

      【讨论】:

        【解决方案3】:

        当您的域模型、映射和数据库之间不匹配时,我已经看到过这种异常。例如,如果您的数据库中有一个可为空的 DateTime 字段,但在您的模型上没有一个可为空的属性。

        我不久前在a post on my blog 中描述了它。我不能肯定这是你的问题,但听起来确实很熟悉。

        【讨论】:

        • 死链接,fwiw。 Archive.org
        • 这正是这个答案。如果您阅读博客文章,除了一些故事讲述之外,其中几乎没有额外的信息。在提出这些建议时,请记住这篇文章是在 2008 年发表的,很久 Stack Overflow 还没有将它的回答礼仪发展到今天。如果您认为可以改进答案,请随时提出修改建议。
        猜你喜欢
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多