NHibernate: запрос по первичному ключу приводит к выводу "ГДЕ (1 = 1)" - PullRequest
4 голосов
/ 08 января 2009

У меня есть лицо, Клиент

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 на первичном ключе? Что я делаю неправильно ?

P.S. Я забыл упомянуть версию NHibernate, которую я использую. Это 2.0.1.GA.

Ответы [ 3 ]

11 голосов
/ 15 февраля 2009

"Идентификатор игнорируется при использовании запроса по примеру. Это сделано, потому что пример объекта с установленным идентификатором в любом случае вернет только один объект." - http://forum.hibernate.org/viewtopic.php?t=927063 и http://forum.hibernate.org/viewtopic.php?p=2351666&sid=c22d2c37f8d67e268b6ffe547f57ad9e
Это для Hibernate. NHibernate был перенесен с него. Так что я уверен, что это тоже есть в NHibernate. Так что используйте Get вместо QBE для id.

0 голосов
/ 12 апреля 2018

Я знаю, что это старый пост, но я столкнулся с этой проблемой сегодня, и ни один из ответов здесь не помог. У нас был метод с именем CountByExample (), который работает правильно, если столбец идентификатора не указан в примере.

Для нашего сценария счет действителен, только если существует объект с указанным идентификатором с определенным набором параметров. Объект - довольно большой объект, поэтому загрузка его была бы ненужной тратой ресурсов и полосы пропускания. Поскольку NHibernate удаляет идентификатор из примера, счетчик всегда был неверным.

Я решил эту проблему с помощью следующей настройки, которая прекрасно работает для меня.

            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};
0 голосов
/ 12 ноября 2009

Что если вы используете EnableLike () в своем запросе в качестве примера критерия объекта для запроса части первичного ключа + некоторых других свойств, тогда ваш запрос вернет более 1 записи. Например: имя пользователя для пользователя является первичным ключом. Свойства вашего объекта, включая первичный ключ, устанавливаются в значения, которые должны запрашиваться оператором like. В этом случае NHibernate не оставляет другого выбора, кроме написания собственного метода запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...