Pergunta

No meu servidor MSSQL, tenho uma exibição SQL chamada AllFavourite. Para carregar os dados na minha classe DTO, tenho o seguinte no meu arquivo 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>

No meu código, tenho o seguinte.

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

Isso funciona muito bem e produz os resultados que eu tenho, no entanto, gostaria de mover o SQL do código para uma consulta nomeada para o arquivo hbm.xml. Então, meu arquivo hbm.xml agora se parece com isso

<?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 meu código agora se parece com isso

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

No entanto, quando eu corro isso, recebo um erro:-

O parâmetro UserID não existe como um parâmetro nomeado em [selecione * de AllFavourite WHERE UserID =: UserID

Então, minha pergunta é possível usar uma consulta nomeada dessa maneira?

Foi útil?

Solução

o query TAG espera uma consulta HQL:

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

Se você quiser escrever uma consulta SQL nativa, você deve usar o sql-query marcação:

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

Outras dicas

Você não precisa disso?

<query-param name='UserId' type='Integer'/>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top