使用Criteria API在不选择所有对象的情况下查询多对多

时间:2010-08-25 14:33:25

标签: nhibernate hql criteria-api

我在Project和Site之间有多对多的关系。我正在尝试使用Criteria API检索项目的站点列表。我有这个工作,但查询还选择了相关项目的所有列,我不想要。我使用HQL编写了我认为是等效查询的内容,它只选择了Site列。

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)以仅选择“网站”列?我尝试使用Projections,但没有方法来投射类型。在这种情况下,我必须使用Criteria API。

1 个答案:

答案 0 :(得分: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