Frage

In meinem MSSQL-Server habe ich eine SQL-Ansicht namens AllFavourite. Um die Daten in meine DTO-Klasse zu laden, habe ich folgendes in meiner hbm.xml Datei ...

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       namespace="Domain.Model.Entities" assembly="Domain.Model">
  <import class="AllFavourite"/>
</hibernate-mapping>

In meinem Code habe ich folgendes.

public IList<AllFavourite> GetFavourites(int userId)
{
    var query = Session
        .CreateSQLQuery("SELECT * FROM AllFavourite where UserId=:UserId")
        .SetInt32("UserId", userId)
        .SetResultTransformer(new AliasToBeanResultTransformer(typeof(AllFavourite)));
    return query.List<AllFavourite>();
}

Dies funktioniert gut, und die Ergebnisse, dass ich nach, aber würde Ich mag die SQL von Code in eine benannte Abfrage in die hbm.xml Datei bewegen. Also meine hbm.xml Datei sieht nun wie folgt

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
namespace="Domain.Model.Entities" assembly="Domain.Model">
  <import class="AllFavourite"/>
  <query name="GetAllFavouriteByUserId">
    <![CDATA[
    SELECT * FROM AllFavourite WHERE UserId=:UserId
    ]]>
  </query>
</hibernate-mapping>

und mein Code sieht nun wie folgt

public IList<AllFavourite> GetFavourites(int userId)
{
    var query = Session
        .GetNamedQuery("GetAllFavouriteByUserId")
        .SetInt32("UserId", userId)
        .SetResultTransformer(new AliasToBeanResultTransformer(typeof(AllFavourite)));
    return query.List<AllFavourite>();
}

Allerdings, wenn ich dies betreibe ich eine Fehlermeldung erhalten: -

  

Parameter UserId existiert nicht als ein   benannten Parameter in [SELECT * FROM   AllFavourite userid =: Benutzer-ID]

Also meine Frage ist es möglich, eine benannte Abfrage auf diese Weise zu benutzen?

War es hilfreich?

Lösung

Der query Tag erwartet eine HQL-Abfrage:

<query name="GetAllFavouriteByUserId">
    <![CDATA[
    from AllFavourite where UserId = :UserId
    ]]>
</query>

Wenn Sie eine native SQL-Abfrage schreiben, möchten Sie die sql-query Tag verwenden sollte:

<sql-query name="GetAllFavouriteByUserId">
    <return alias="foo" class="Foo"/>
    <![CDATA[
    SELECT {foo.ID} as {foo.ID}, 
           {foo}.NAME AS {foo.Name} 
    FROM sometable 
    WHERE {foo}.ID = :UserId
    ]]>
</sql-query>

Andere Tipps

Sie nicht, diese brauchen?

<query-param name='UserId' type='Integer'/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top