【问题标题】:NHibernate : Query by example on primary key produces "WHERE (1=1)"NHibernate:通过示例查询主键会产生“WHERE (1=1)”
【发布时间】:2018-04-12 09:05:37
【问题描述】:

我有一个实体客户

public class Customer
{
    public virtual int ID { get; set; }
    public virtual string Firstname { get; set; }
    public virtual string Lastname { get; set; }
}

我的 DAL 方法是:

    public IList<Customer> GetCustomers(Customer example)
    {
        var customers = default(IList<Customer>);

        using (var sessiong = GetSession())
        {
            customers = sessiong.CreateCriteria(typeof(Customer))
                .Add(Example.Create(example))
                .List<Customer>();
        }

        return customers;
    }

但问题是当我这样调用我的方法时

    var exemple = new Customer() { ID = 2 };
    var customers = provider.GetCustomers(exemple);

我在数据库中有我所有客户的集合,因为 NHibernate 生成以下 SQL 查询

NHibernate: SELECT this_.CustomerId as CustomerId0_0_, this_.Firstname as Firstname0_0_, this_.Lastname as Lastname0_0_ FROM Customers this_ WHERE (1=1)

NHibernate 在主键上支持 QBE 吗? 我究竟做错了什么 ?

附:我忘了提及我正在使用的 NHibernate 版本。现在是 2.0.1.GA。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    “使用示例查询时忽略 ID。这样做是因为设置了 id 的示例对象无论如何都只会返回一个对象。” - http://forum.hibernate.org/viewtopic.php?t=927063http://forum.hibernate.org/viewtopic.php?p=2351666&sid=c22d2c37f8d67e268b6ffe547f57ad9e
    这是针对休眠的。 NHibernate 是从它移植过来的。所以我确信这也是 NHibernate 的设计。所以在 id 上使用 Get 而不是 QBE。

    【讨论】:

      【解决方案2】:

      如果您通过示例条件对象在查询中使用 EnableLike() 来查询主键的一部分 + 一些其他属性,那么您的查询将返回多于 1 条记录。例如:用户的用户名是主键。您的对象的属性(包括主键)设置为应该由 like 运算符查询的值。在这种情况下,NHibernate 除了编写自己的查询方法之外别无选择。

      【讨论】:

        【解决方案3】:

        我知道这是一篇旧帖子,但我今天遇到了这个问题,这里的答案都没有帮助。我们有一个名为 CountByExample() 的方法,只要示例中未指定 ID 列,该方法就可以正常工作。

        对于我们的场景,仅当具有指定 ID 的对象具有一组特定参数时,计数才有效。该对象是一个相当大的对象,因此加载它会不必要地浪费资源和带宽。因为 NHibernate 从示例中去除了 ID,所以计数总是不正确的。

        我通过以下适合我的调整解决了这个问题。

                    criteria.Add(example);
                    //HACK: Check for ID query and force NHibernate to take it
                    var prop = searchParameters.GetType().GetProperty("ID");
                    if (prop != null)
                    {
                        criteria.Add(Restrictions.Eq("ID", prop.GetValue(exampleT)));
                    }
        

        其中“searchParameters”是一个对象,如:

        var searchParameters= new { ID = 48, isEnabledForAds = true, hasOptedOut = false};
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-13
          • 2010-10-05
          • 1970-01-01
          • 1970-01-01
          • 2012-01-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多