Pregunta

Es posible volver a una entidad que utiliza una proyección de la consulta?

Yo lo he hecho con éxito con una consulta SQL (ver más abajo), pero no puede encontrar la manera de hacerlo con una proyección de consulta.

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

Solución

Sí, usted puede regresar a las entidades de la proyección de las consultas.

Si usted está utilizando una consulta HQL puede especificar un constructor para la clase dada en el HQL cláusula select:

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

En este ejemplo se requiere que los Foo clase tiene un constructor que se ajusta a la firma utilizado en la consulta HQL.I. e:

También se podría utilizar el AliasToBean ResultTransformer, que asigna automáticamente los valores devueltos por la consulta a las propiedades de un determinado tipo.Este enfoque requiere que el alias usado en la consulta que se asignan directamente a las propiedades de un determinado tipo.Por ejemplo:

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

Para hacer estos ejemplos de trabajo, la clase Foo podría tener este aspecto:

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

La clase anterior contiene una válida constructor de la primera HQL ejemplo.También define las propiedades públicas que se alinean con los alias utilizados en la segunda consulta HQL, que hace posible que el AliasToBean transformador para llenar las entidades del tipo Foo a partir de los resultados de la consulta.

Sin embargo, en el ejemplo que das, parece como si desea devolver dos tipos de entidades de la misma proyección de la consulta.Que podrían ser más difíciles de lograr el uso de estos métodos.Hice un par de pruebas rápidas, sin suerte alguna.

Actualización:

Usted puede utilizar el AliasToBean resultado del transformador con los Criterios de la API, así como con HQL.El transformador se utiliza de la misma manera, pero la proyección de la consulta se ve un poco diferente, utilizando Criterios.Aquí es un ejemplo que utiliza un criterio de consulta:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top