Domanda

Nel mio server MSSQL ho una visione SQL chiamato AllFavourite. Al fine di caricare i dati nella mia classe DTO Ho il seguente nel mio file hbm.xml ...

<?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>

Nel mio codice ho il seguente.

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>();
}

Questa grande opera e produce i risultati che io sono dopo, però vorrei spostare lo SQL dal codice in una query di nome nel file hbm.xml. Quindi il mio file hbm.xml ora assomiglia a questo

<?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>

e il mio codice ora assomiglia a questo

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

Tuttavia quando ho eseguito questo ottengo un errore: -

  

Il parametro UserId non esiste come un   nome parametro nella [SELECT * FROM   AllFavourite DOVE UserId =: UserId]

Quindi la mia domanda è possibile utilizzare una query denominata in questo modo?

È stato utile?

Soluzione

Il tag query si aspetta una query HQL:

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

Se si vuole scrivere una query SQL nativo è necessario utilizzare il tag sql-query:

<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>

Altri suggerimenti

Non hai bisogno di questo?

<query-param name='UserId' type='Integer'/>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top