سؤال

في خادم 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'/>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top