2010-08-25 65 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