2010-02-04 10 views
1

J'essaie de reproduire la fonctionnalité 'select new ObjectToProjectOut' du style HqlQuery. c'est-à-dire prendre une liste de colonnes renvoyées à partir d'une requête et renvoyer sous la forme d'une liste de types ObjectToProjectOut qui sont instanciés à l'aide d'un constructeur avec autant de paramètres que les colonnes de la requête.NHibernate Projection utilisant SqlQuery

C'est en effet ce que 'select new ObjectToProjectOut' obtient dans Hql .... mais clairement ce n'est pas disponible dans SqlQuery. Je pense que je dois définir une transformation de résultat et utiliser soit PassThroughResultTransformer, DistinctRootEntityResultTransformer etc pour le faire fonctionner.

Quelqu'un sait ce que je devrais utiliser?

Répondre

2

ok .... après avoir regardé le code NHibernate, il semble que je cherchais AliasToBeanConstructorResultTransformer .... bien sûr!

Cependant, j'ai peut-être trouvé un bogue nHibernate. Si vous avez le même nom de colonne retourné deux fois à partir de deux tables différentes (market.name et account.name, disons) alors au moment où nHibernate retourne le tableau de la base de données au transformateur, la première occurrence de 'Name' sera utilisée pour tous les deux. Méchant.

La contournement est un alias unique. Avec Hql, le sql généré est fortement aliasé, donc c'est seulement un bug avec SqlQuery.

Grrrr. Aujourd'hui doit être mon jour, également trouvé another nHibernate bug/issue I've posted to StackOverflow for comment.

1

Vous pouvez utiliser la méthode AddEntity pour remplir des entités à partir d'une requête SQL.

Voici deux exemples de la NHibernate docs:

sess.CreateSQLQuery("SELECT * FROM CATS") 
    .AddEntity(typeof(Cat)); 

sess.CreateSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS") 
    .AddEntity(typeof(Cat)); 
+0

Non désolé, ils ne sont pas des entités, ce sont des projections. – penderi