[英]How to convert SQL aggregate query into NHibernate Criteria Query
我是 NHibernate 中的標准 API 的新手。 有人可以使用 NHibernate 中的標准 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 中的標准 API 進行操作。 PS我不想使用HQL所以沒有HQL是否可以在nhibernate中生成這種sql?
您也可以使用 linq-2-nhibernate。
給定以下 class 結構:
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;}
}
這是您使用標准 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 表中的外鍵。 無緣無故地加入額外的桌子是沒有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.