2011-07-12 96 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

这些查询不打两次数据库。 –