2010-05-06 1 views
7

Я читал о подзапросе в критериях, но я все еще не могу понять его должным образом. Здесь я беру один пример, и если кто-то может мне помочь написать, что с помощью подзапроса это будет здорово.Запись подзапроса в критериях nHibernate

Допустим, у нас есть таблица

Employee{EmployeeId.(int),Name(string),Post(string),No_Of_years_working(int)} 

Теперь я хочу, чтобы все сотрудники, которые менеджеры и работают менее 10 лет. Я знаю, что мы можем получить результат без использования подзапросов, но я хочу использовать подзапрос, чтобы понять, как он работает в критериях.

Итак, как я могу писать критерии, используя подзапрос, чтобы получить этих сотрудников.

ответ

11

Ну - код должен быть что-то вроде этого:

DetachedCriteria dc = DetachedCriteria.For<Employee>() 
.Add (Subqueries.PropertyIn("EmployeeId", 
    DetachedCriteria.For<Employee>() 
     .SetProjection(Projections.Property("EmployeeId")) 
     .Add(Restrictions.Lt("No_Of_years_working", 10)) 
     .Add(Restrictions.Eq("Post", "Manager")) 
); 

Надеется, что это помогает.

0

Я пытался выполнить что-то подобное задаче Бипула, когда я нашел этот вопрос, поэтому я получил в основном идею ответа Бернхардруша, но я понял, что без добавления Projections.projectionList подзапрос не работает. Поэтому я решил отбросить несколько строк кода с окончательной версией:

Session session; //You get the session according with your app logic 

//Let's define first the subquery 
DetachedCriteria sub = DetachedCriteria.forClass(Employee.class); 
sub.add(Restrictions.lt("No_Of_years_working", 10)); 
sub.add(Restrictions.eq("Post", "Manager")); 
sub.setProjection( 
Projections.projectionList().add(     Projections.property("EmployeeId") 
) 
); 

//Now the main query 
Criteria criteria = session.createCriteria(Employee.class); 
criteria.add(Property.forName("EmployeeId").in(sub));