Question

Est-il possible de retourner une entité en utilisant une requête de projection?

Je l'ai fait avec succès une requête SQL (voir ci-dessous), mais ne peut pas trouver comment le faire avec une requête de projection.

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()
Était-ce utile?

La solution

Oui, vous pouvez retourner des entités de requêtes de projection.

Si vous utilisez une requête HQL vous pouvez spécifier un constructeur de la classe donnée dans la HQL clause select:

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

Cet exemple exige que la classe Foo a un constructeur qui correspond à la signature utilisée dans la requête HQL. I.e.:

Vous pouvez également utiliser le AliasToBean ResultTransformer, qui affecte automatiquement les valeurs renvoyées par la requête aux propriétés d'un type donné. Cette approche exige que les alias utilisés dans la carte de requête directement aux propriétés du type donné. Par exemple:

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

Pour que ces exemples fonctionnent, la classe Foo pourrait ressembler à ceci:

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 classe ci-dessus contient un constructeur valable pour le premier exemple HQL. Elle définit également des propriétés publiques qui cadrent avec les alias utilisés dans la deuxième requête HQL, qui permet pour le transformateur AliasToBean pour remplir les entités du type Foo à partir des résultats de la requête.

Cependant, à partir de l'exemple que vous donnez, il semble que si vous voulez retourner deux types d'entités de la même requête de projection. Cela pourrait être plus difficile à réaliser en utilisant ces méthodes. Je l'ai fait quelques tests rapides, sans chance.

Mise à jour:

Vous pouvez utiliser le transformateur de résultat AliasToBean avec l'API de critères ainsi qu'avec HQL. Le transformateur est utilisé de la même manière, mais la requête de projection est un peu différent à l'aide de critères. Voici un exemple qui utilise une requête de critères:

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>();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top