سؤال

ما هي أفضل الممارسات لهذه المشكلة؟ هل هناك أي ميزات الخلط مدمجة؟

عينة من الرموز:

using (ITransaction transaction = _session.BeginTransaction())
{
   _session.Delete("FROM myObject o WHERE  o.Id = IN(1,2,...99999)");
   transaction.Commit();
}

شكرا مقدما.

هل كانت مفيدة؟

المحلول

يدعم HQL بالشرط، وإذا كنت تستخدم SetParameterList، فيمكنك نقلها في مجموعة.

var idList = new List<int>() { 5,3,6,7 };

_session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
    .SetParameterList("idList", idList)
    .ExecuteUpdate();

كن على دراية، مثل DDANGO في تعليق، لن يتم تنفيذ شلاقات العلاقة المحددة في الكائنات الخاصة بك لأن تشغيل استعلام HQL ببساطة يترجم ببساطة إلى استعلام DB ولا يقوم بالفعل بتحميل أي كائنات كيانات.

نصائح أخرى

كان لدي مشاكل في الحصول على إجابة للعمل ووجدت الاستعلام التالي عملت بنسبة 100٪

        Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
            .SetParameterList("deleteIds", deleteIds)
            .ExecuteUpdate();

العميل هو اسم الفصل وليس اسم الجدول. معرف هو صغير وفي HQL هو المفتاح الأساسي وليس اسم خاصية في الفصل (أسماء الممتلكات مدعومة)

يمكنك استخدام HQL لحذف كائنات متعددة

ابحث عن حذف هنا - للحصول على Session.Delete مثال

مثال حذف HQL (يمكنك استخدامه في HQL):

ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();

String hqlDelete = "delete Customer c where c.name = :oldName";
// or String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = session.CreateQuery( hqlDelete )
        .SetString( "oldName", oldName )
        .ExecuteUpdate();
tx.Commit();
session.Close();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top