2010-01-27 4 views
3

Est-il possible de renvoyer une entité à l'aide d'une requête de projection?Entité de retour via une requête de projection

Je l'ai fait avec succès avec une requête SQL (voir ci-dessous), mais je ne trouve pas 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() 

Répondre

6

Oui, vous pouvez renvoyer des entités à partir 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 AliasToBean ResultTransformer, qui mappe automatiquement les valeurs renvoyées par la requête aux propriétés d'un type donné. Cette approche nécessite que les alias utilisés dans la requête correspondent 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. Il définit également les propriétés publiques qui s'alignent sur les alias utilisés dans la deuxième requête HQL, ce qui permet au transformateur AliasToBean de remplir les entités de type Foo à partir des résultats de la requête. Toutefois, à partir de l'exemple que vous donnez, il semble que vous souhaitiez renvoyer deux types d'entités à partir de la même requête de projection. Cela pourrait être plus difficile à réaliser en utilisant ces méthodes. J'ai fait quelques tests rapides, sans aucune 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 légèrement différente à 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>(); 
+0

Merci! Idéalement, je voudrais utiliser les critères API sur HQL. En tant que solution de contournement (temp), j'utilise une requête de l'entité A et l'entité de chargement avec impatience B. – Starfield

+0

Content de pouvoir vous aider! Le transformateur AliasToBean fonctionne également avec l'API Criteria, j'ai mis à jour la réponse avec un exemple. –

Questions connexes