Nhibernate ICreteria связь между таблицами - PullRequest
1 голос
/ 27 октября 2009

У меня есть две сущности: клиент и заказ, которые существуют самостоятельно и не имеют отношений, определенных в файле сопоставления.

Теперь я хочу, чтобы nhibernate выдал мне результат следующего запроса:

select customer.id,customer.name from customer,order
where customer.id = order.id
and order.status = "Open"

Я пытался использовать проекцию, но при проверке выходных данных sql я вижу, что Nhibernate создает подзапрос, который не является моим намерением (и менее производительным?)

public IList<Customer> GetOpenOrders()
{
                    DetachedCriteria orders = DetachedCriteria.For<Order>("orders")  
                    .SetProjection(Projections.Property("orders.id"));

                    ICriteria cret = session.CreateCriteria(typeof(Customer)) 
                    .Add(Subqueries.PropertyIn("id", orders)) 
                    .Add(Expression.Eq("Status", "open"));

                    return cret.List<Customer>();
}

Можно ли сделать это с помощью критериев или есть лучший способ выполнить такого рода запросы?

Ответы [ 3 ]

1 голос
/ 27 октября 2009

Лучшим способом было бы связать клиента и заказ в отображении.

  1. Класс клиента имеет коллекцию заказов как свойство.
  2. В классе заказа в качестве свойства указан клиент.
  3. Оба

Это немного больше работы в отображении, но будет меньше работы по написанию запросов и кода с использованием объектов customer и order.

1 голос
/ 27 октября 2009

если у вашего клиента есть коллекция заказов, вы можете использовать это:

ICriteria cret = session.CreateCriteria(typeof(Customer)) 
                    .CreateCriteria("orders") 
                          .Add(Expression.Eq("Status", "open"));
1 голос
/ 27 октября 2009

Я не уверен, что вы можете сделать это с помощью API ICriteria, потому что запросы ICriteria создаются для определенного объекта, но вы должны быть в состоянии сделать это с HQL:

select customer
from Customer customer, Orders order
where customer.id = order.id and order.status = 'Open'
...