如何将SQL聚合查询转换为NHibernate Criteria Query

时间:2011-07-12 11:35:13

标签: nhibernate fluent-nhibernate

我是NHibernate中Criteria API的新手。有人可以使用NHibernate中的Criteria API生成这条SQL吗?

select count(*) 
from result where Student_id 
in(
  SELECT s.Student_id 
  from Department as d
  JOIN Student s ON d.Dept_id=s.Dept_id
  where d.Dept_id=2
)

以及如何在NHibernate中继续使用Criteria API。 P.S我不想使用HQL,所以没有HQL是否可以在nhibernate中生成这种sql?

您也可以使用linq-2-nhibernate。

1 个答案:

答案 0 :(得分:3)

给出以下类结构:

public class Result{
    public virtual Student Student {get; set;}
}

public class Student{
    public virtual Department Department {get; set;}
    public virtual int Id { get; set;}
}

public virtual Department {
    public virtual int Id {get; set;}
    public virtual IList<Student> Students {get; set;}
} 

以下是使用Criteria API的查询:

var studentidquery = DetachedCriteria.For<Student>()
  .Add(Restrictions.Eq("Department.Id"),2)
  .SetProjection(Projections.Property("Id"));

var count = session.CreateCriteria<Result>()
   .Add(Subqueries.PropertyIn("StudentId", studentidquery))
   .UniqueResult<int>();

使用QueryOver API,它看起来像这样:

var studentidquery = QueryOver.Of<Student>()
  .Where(x=>x.Department.Id==2)
  .Select(x=>x.Id);

var count = session.QueryOver<Result>()
   .WithSubquery.WhereProperty(x => x.Id).In(studentidquery)
   .Select(Projections.Count<Result>(r=>r.Id))
   .UniqueResult<int>();

此外,我认为您不需要在SQL查询中加入Department,因为您已将DepartmentId作为Student表中的外键。没有充分理由加入额外的表是没有意义的。