tags:

views:

920

answers:

2

Hi, I have an entity Customer

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

and my DAL method is :

    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;
    }

but the problem is that when I call my method like this

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

I have a collection of all my customers in the database because NHibernate generates the following SQL query

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

NHibernate supports QBE on primary key ? What am I doing wrong ?

P.S. I've forgotten to mention the version of NHibernate that I'm using. It's 2.0.1.GA.

+6  A: 

"The ID is ignored when using query by example. This is done because an example object with the id set would return only one object anyways." - http://forum.hibernate.org/viewtopic.php?t=927063 and http://forum.hibernate.org/viewtopic.php?p=2351666&amp;sid=c22d2c37f8d67e268b6ffe547f57ad9e
This is for Hibernate. NHibernate was ported from it. So I'm sure that this is by design in NHibernate too. So use Get instead of QBE on id.

zihotki
A: 

What if you use EnableLike() on your query by example criteria object to query for a part of primary key + some other properties then your query would return more than 1 record. e.g.: User name for a user is primary key. Your object's properties including primary key are set to values which should be queried by like operator. In that case NHibernate leaves no choice other than writing your own query method.

gunalmel