我是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。
答案 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表中的外键。没有充分理由加入额外的表是没有意义的。