2011-07-12 95 views
0

我是NHibernate中Criteria API的新手。有人可以使用NHibernate中的Criteria API生成這段SQL語句嗎?如何將SQL聚合查詢轉換爲NHibernate標準查詢

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。

+2

嘿,快樂。如果你在拼寫/語法/函數上做了額外的工作,這將會有所幫助。如果一個問題容易閱讀,你更有可能獲得幫助。此外,如果您先嚐試自己解決問題,並通過詢問幫助向我們展示您到目前爲止的情況,通常會感激不盡。 [NHibernate文檔](http://nhforge.org/doc/nh/en/index.html#manipulatingdata-criteria)可以幫助你解決這個問題。 – Jeroen

+0

@jeroen以及我已經看到,問題是我可以基於單個查詢,但如何做到這一點特別是當計數是基於另一個子查詢,我上面提到..我不知道如果即時進行正確的原因,我沒有成功所以我尋求幫助...對不起英語,但對不起:) – Joy

回答

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;} 
} 

下面是使用您的查詢的標準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表中輸入n個鍵。沒有理由加入額外的桌子沒有意義。

+0

正是我想要的..我有那些映射對不起,因爲沒有給我的問題,我認爲這隻會做。無論如何,這裏有一個問題...我們打了兩次數據庫?是不是有可能一次生成查詢?我可以看到的是它擊中了數據庫兩次以完成工作:)我覺得如果同樣的事情可以一次完成呢? :) – Joy

+1

這些查詢不打兩次數據庫。 –