2010-11-27 9 views
7

Ist es möglich, etwas in NHibernate zu tun?NHibernate: Get Objekt von SQL-Abfrage

Product GetSpecificProduct() 
{ 
    return session.CreateSQLQuery("SELECT * FROM Products WHERE price = 
     $500").UniqueResult<Product>(); 
} 

Wenn ich versuche, diesen Code auszuführen, erhalte ich:

System.InvalidCastException: Kann nicht das Objekt von Typ 'System.Object []' Produkt geben.

Oder muss ich die NHibernate-Abfragesprache verwenden?

Antwort

8

Wenn Sie CreateSqlQuery verwenden, können Sie die folgenden Befehle verwenden:

Product GetSpecificProduct() 
{ 
    ISQLQuery query = session.CreateSQLQuery("SELECT * FROM Products WHERE price = $500"); 
    Product p = query.SetResultTransformer(Transformers.AliasToBean<Product>()).UniqueResult<Product>(); 
} 

Ich schlage vor, Sie besser nutzen ICriteria wie in:

Product GetSpecificProduct() 
{ 
    ICriteria c = session.CreateCriteria(); 
    c.Add(Expression.Eq("Price", 500)); 
    return c.UniqueResult<Product>(); 
} 
+2

eigentlich funktioniert die SetResultTransformer Sache nicht für mich ... Ich bekomme eine Fehlermeldung sagen : Fehler - NHibernate.PropertyNotFoundException: Es wurde kein Setter für die Eigenschaft 'Manufacturer' in der Klasse Product .............. gefunden. (Dies ist irgendwie richtig, da ich keinen Property - Hersteller in der Klassenprodukt; die Eigenschaft heißt ManufacturerName; die Nhibernate-XML-Zuordnung gibt an, dass ManufacturerName-Prop. der Manufacturer-Spalte in der Tabelle zugeordnet wird) – MadSeb

+0

Anstatt * auszuwählen, können Sie die gewünschten Spalten in der Produkttabelle angeben. Auf diese Weise funktioniert SetResultTransformer. –

+0

@sh_kamalh Ich habe alle Spalten angegeben und habe immer noch den gleichen Fehler – Ms01

4

Ja, Sie können. Schauen Sie sich Entity Abfragen mit Native SQL: http://codewut.de/content/using-native-sql-nhibernate

+0

Der Link funktioniert nicht mehr. "Dieser Inhalt ist nicht mehr auf Knol verfügbar." – Liedman

+0

Hier ist ein anderer. http://codewut.de/content/using-native-sql-nhibernate Oder einfach google "Entity Abfragen mit Native SQL NHibernate" :) – basarat