باستخدام استعلام مسمى في HBM مع فئة الاستيراد
-
22-09-2019 - |
سؤال
في خادم MSSQL الخاص بي ، لدي عرض SQL يسمى Allfavourite. من أجل تحميل البيانات في فئة DTO الخاصة بي ، لدي ما يلي في ملف 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>
في الكود الخاص بي لدي ما يلي.
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>();
}
هذا يعمل بشكل رائع وينتج النتائج التي أنا بعدها ، ومع ذلك أود نقل SQL من الكود إلى استعلام مسمى في ملف HBM.XML. لذا فإن ملف 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"/>
<query name="GetAllFavouriteByUserId">
<![CDATA[
SELECT * FROM AllFavourite WHERE UserId=:UserId
]]>
</query>
</hibernate-mapping>
ويبدو الكود الخاص بي الآن هكذا
public IList<AllFavourite> GetFavourites(int userId)
{
var query = Session
.GetNamedQuery("GetAllFavouriteByUserId")
.SetInt32("UserId", userId)
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(AllFavourite)));
return query.List<AllFavourite>();
}
ومع ذلك ، عندما أقوم بتشغيل هذا ، أحصل على خطأ:-
لا توجد معلمة userId كمعلمة مسماة في [SELECT * من allfavourite حيث userId =: userD
إذن سؤالي هل من الممكن استخدام استعلام مسمى بهذه الطريقة؟
المحلول
ال query
تتوقع العلامة استعلام HQL:
<query name="GetAllFavouriteByUserId">
<![CDATA[
from AllFavourite where UserId = :UserId
]]>
</query>
إذا كنت ترغب في كتابة استعلام SQL الأصلي ، يجب عليك استخدام 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>
نصائح أخرى
ألا تحتاج إلى هذا؟
<query-param name='UserId' type='Integer'/>
لا تنتمي إلى StackOverflow