Mit Hilfe einer benannten Abfrage in einer hbm mit Import-Klasse
-
22-09-2019 - |
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?
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'/>