2010-01-13 53 views
6

我有一個包含GLCode的表GL。我需要獲取唯一的GLCode列表,但獲取所有其他列。以下SQL產生我想要的結果。NHibernate:獲取基於列的不同結果,但檢索所有列

select * from GL where GLId in (select Min(GLId) from GL group by GLCode) 

有沒有辦法使用Criteria API來做到這一點?

這是我最好的嘗試:

 var subQuery = DetachedCriteria.For<GL>(); 
     subQuery 
      .SetProjection(Projections.Property("GLCode"))     
      .SetResultTransformer(new DistinctRootEntityResultTransformer()); 

     return (List<GL>)currentSession 
      .CreateCriteria(typeof(GL)) 
      .Add(Subqueries.PropertyIn("GLCode", subQuery)) 
      .List<GL>(); 
+0

我也面臨同樣的問題。任何幫助? – Bipul 2010-07-08 11:42:34

回答

3

即使NHibernate的沒有辦法從子查詢的結果列排除GLCode,仍然可以創建一個查詢,沒有工作。使用相關的EXISTS子查詢而不是IN。我們拍攝的SQL是這樣的:

select query.* 
from GL query 
where exists (
    select 
     min(subquery.GLId) AS GLId, 
     subquery.GLCode 
    from GL subquery 
    group by subquery.GLCode 
    having min(subquery.GLId) = query.GLId); 

而這裏的NHibernate的查詢:

var min = Projections.Min("GLId"); 

var subquery = DetachedCriteria.For<GL>("subquery") 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.GroupProperty("GLCode"), "GLCode") 
     .Add(min, "GLId")) 
    .Add(Restrictions.EqProperty(min, "query.GLId")); 

return session.CreateCriteria<GL>("query") 
    .Add(Subqueries.Exists(subquery)) 
    .List<GL>(); 
+0

真的很喜歡nhibernate答案前的sql示例。 – ctrlplusb 2012-06-19 07:18:10

相關問題