Запрос «многие ко многим» без выбора всех объектов с помощью API Criteria - PullRequest
1 голос
/ 25 августа 2010

У меня есть отношения многие ко многим между Проектом и Сайтом. Я пытаюсь получить список сайтов для проекта, используя Criteria API. У меня это работает, но запрос также выбирает все столбцы для связанных проектов, которые я не хочу. Я написал то, что считал эквивалентным запросом, используя HQL, и он выбирал только столбцы сайта.

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>();

Как ограничить версию API критериев (target2), чтобы выбирать только столбцы сайта? Я пытался использовать проекции, но нет способа проецировать тип. Я должен использовать Criteria API в этом случае.

1 Ответ

1 голос
/ 26 августа 2010

Я не уверен, что это лучший способ, но я заставил его работать с помощью 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
...