Pergunta

É possível retornar uma entidade usando uma consulta de projeção?

Fiz isso com sucesso com uma consulta SQL (veja abaixo), mas não consigo descobrir como fazer isso com uma consulta de projeção.

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()
Foi útil?

Solução

Sim, você pode retornar entidades de consultas de projeção.

Se você estiver usando uma consulta HQL, poderá especificar um construtor para a classe fornecida na cláusula select HQL:

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

Este exemplo requer que a classe Foo tenha um construtor que se ajuste à assinatura usada na consulta HQL.Ou seja:

Você também pode usar o AliasToBean ResultTransformer, que mapeia automaticamente os valores retornados da consulta para as propriedades de um determinado tipo.Essa abordagem exige que os aliases usados ​​na consulta sejam mapeados diretamente para propriedades do tipo determinado.Por exemplo:

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

Para fazer esses exemplos funcionarem, a classe Foo poderia ter esta aparência:

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; }
}

A classe acima contém um construtor válido para o primeiro exemplo HQL.Também define propriedades públicas que se alinham com os aliases usados ​​na segunda consulta HQL, o que possibilita ao transformador AliasToBean preencher entidades do tipo Foo a partir dos resultados da consulta.

No entanto, pelo exemplo que você dá, parece que você deseja retornar dois tipos de entidades da mesma consulta de projeção.Isso pode ser mais difícil de conseguir usando esses métodos.Fiz alguns testes rápidos, sem sorte.

Atualizar:

Você pode usar o transformador de resultado AliasToBean com a API Criteria e também com HQL.O transformador é usado da mesma maneira, mas a consulta de projeção parece um pouco diferente usando Critérios.Aqui está um exemplo que usa uma consulta de critérios:

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>();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top