Написать подзапрос в Критерии nHibernate - PullRequest
7 голосов
/ 06 мая 2010

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

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

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

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

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

Ответы [ 2 ]

12 голосов
/ 06 мая 2010

Хорошо - код должен быть примерно таким:

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 голосов
/ 12 февраля 2013

Я пытался выполнить что-то похожее на задачу Бипула, когда нашел этот вопрос, поэтому я в основном получил идею ответа Бернхардруша, но я понял, что без добавления Projection.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) ); 
...