Вопрос

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

Я успешно сделал это с помощью 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()
Это было полезно?

Решение

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

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

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

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

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

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.Трансформатор используется таким же образом, но запрос проекции при использовании Criteria выглядит немного иначе.Вот пример, в котором используется запрос критериев:

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>();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top