2010-01-27 3 views
3

Возможно ли вернуть объект, используя запрос проекции?Возвращаемый объект через запрос прогноза

Я успешно выполнил это с 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() 

ответ

6

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

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

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

Этот пример предполагает, что класс Foo имеет конструктор, который соответствует подписи, используемой в HQL-запрос. I.e:

Вы также можете использовать 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 из результатов запроса.

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

Update:

Вы можете использовать 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>(); 
+0

Спасибо! В идеале я бы хотел использовать API критериев над HQL. В качестве временного решения (temp) Я использую запрос объекта A и с нетерпением загружаю объект B. – Starfield

+0

Рад, что я мог помочь! Трансформатор AliasToBean также работает с API критериев, я обновил ответ на примере. –

Смежные вопросы