在nHibernate的Criteria中编写子查询

时间:2010-05-06 07:09:03

标签: nhibernate criteria subquery

我在Criteria中读到过子查询,但我仍然无法正确掌握它。在这里,我举一个例子,如果有人可以帮助我使用子查询来编写它,那就太棒了。

让我们说我们有桌子

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

现在,我希望所有员工都是经理,工作不到10年。我知道我们可以在不使用子查询的情况下获得结果,但我想使用子查询来了解它在标准中的工作原理。

那么,我如何使用子查询编写Criteria来获取这些员工。

2 个答案:

答案 0 :(得分:12)

嗯 - 代码应该是这样的:

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"))
);

希望这有帮助。

答案 1 :(得分:0)

当我发现这个问题时,我试图执行类似于Bipul的任务,所以我主要得到了bernhardrusch的答案,但我已经意识到没有添加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) );