2010-08-25 40 views
1

我在Project和Site之間有多對多的關係。我正在嘗試使用Criteria API檢索項目的網站列表。我有這個工作,但查詢還選擇了所有相關項目的列,我不想要。我寫了我認爲是使用HQL的等價查詢,並且它只選擇「站點」列。查詢多對多而無需使用Criteria API選擇所有對象

var target1 = session.CreateQuery("select s from Site s join s.Projects pr where pr.ProjectId = ?") 
    .SetInt32(0, projectId) 
    .List<Site>(); 

var target2 = session.CreateCriteria<Site>() 
    .CreateAlias("Projects", "pr") 
    .Add(Restrictions.Eq("pr.ProjectId", projectId)) 
    .List<Site>(); 

如何限制Criteria API版本(target2)僅選擇Site列?我嘗試使用投影,但沒有方法來投影類型。在這種情況下,我必須使用Criteria API。

回答

1

我不知道這是否是最好的方式,但我得到了它使用SqlProjection工作:

Session.CreateCriteria<T>("foo") 
      .CreateAlias("foo.Bar", "bar") 
      .SetProjection(Projections.SqlProjection("{alias}.*", new string[] {}, new IType[] {})) 
      .SetResultTransformer(new AliasToBeanResultTransformer(typeof(Foo))) 
      .List<Foo>(); 

這將產生以下SQL:

SELECT this_.* FROM Foo this_ inner join Bar b1_ on this_.BarId=b1_.Id