我在Criteria中读到过子查询,但我仍然无法正确掌握它。在这里,我举一个例子,如果有人可以帮助我使用子查询来编写它,那就太棒了。
让我们说我们有桌子
Employee{EmployeeId.(int),Name(string),Post(string),No_Of_years_working(int)}
现在,我希望所有员工都是经理,工作不到10年。我知道我们可以在不使用子查询的情况下获得结果,但我想使用子查询来了解它在标准中的工作原理。
那么,我如何使用子查询编写Criteria来获取这些员工。
答案 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) );