Возврат объекта через проекционный запрос

Можно ли вернуть объект с помощью проекционного запроса?

Я успешно сделал это с помощью SQL-запроса (см. ниже), но не могу найти, как это сделать с помощью проекционного запроса.

Dim sql As String = "SELECT {a.*}, {b.*} FROM a LEFT OUTER JOIN b ON a.pk = b.fk")

' Convert SQL results into entities {a} and {b}
Dim query As IQuery = session.CreateSQLQuery(sql) _
                                  .AddEntity("a", GetType(a)) _
                                  .AddEntity("b", GetType(b))

Return query.List()

person Starfield    schedule 27.01.2010    source источник


Ответы (1)


Да, вы можете возвращать сущности из запросов проекции.

Если вы используете запрос HQL, вы можете указать конструктор для данного класса в предложении выбора HQL:

IList<Foo> foos = session.CreateQuery(
    "select new Foo(f.Name, f.Value) from Foo f")
    .List<Foo>();

В этом примере требуется, чтобы класс Foo имел конструктор, соответствующий сигнатуре, используемой в запросе HQL. То есть:

Вы также можете использовать AliasToBean ResultTransformer, который автоматически сопоставляет значения, возвращаемые запросом, со свойствами данного типа. Этот подход требует, чтобы псевдонимы, используемые в запросе, сопоставлялись непосредственно со свойствами данного типа. Например:

IList<Foo> foos = session.CreateQuery(
    "select f.Name as Name, f.Value as Value from Foo f")
    .SetResultTransformer(Transformers.AliasToBean<Foo>())
    .List<Foo>();

Чтобы эти примеры работали, класс Foo может выглядеть так:

public class Foo
{
    public Foo() { }

    public Foo(string name, double value)
    {
        Name = name;
        Value = value;
    }

    public virtual string Name { get; set; }
    public virtual double Value { get; set; }
}

Приведенный выше класс содержит допустимый конструктор для первого примера HQL. Он также определяет общедоступные свойства, соответствующие псевдонимам, используемым во втором HQL-запросе, что позволяет преобразователю AliasToBean заполнять сущности типа Foo из результатов запроса.

Однако из приведенного вами примера кажется, что вы хотите вернуть два типа сущностей из одного и того же проекционного запроса. Это может быть труднее достичь с использованием этих методов. Я сделал пару быстрых тестов, но безуспешно.

Обновление:

Вы можете использовать преобразователь результатов AliasToBean с Criteria API, а также с HQL. Трансформатор используется таким же образом, но запрос проекции выглядит немного иначе с использованием Критериев. Вот пример, в котором используется запрос критериев:

IList<Foo> foos = session.CreateCriteria<Foo>()
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Name"), "Name")
        .Add(Projections.Property("Value"), "Value"))
    .SetResultTransformer(Transformers.AliasToBean<Foo>())
    .List<Foo>();
person Erik Öjebo    schedule 27.01.2010
comment
Спасибо! В идеале я хотел бы использовать API критериев вместо HQL. В качестве (временного) обходного пути я использую запрос объекта A и жадно загружаю объект B. - person Starfield; 28.01.2010
comment
Рад, что смог помочь! Преобразователь AliasToBean также работает с Criteria API, я обновил ответ примером. - person Erik Öjebo; 28.01.2010