سؤال

لماذا يفشل استعلام HQL التالي؟

string hql = @"delete MyLog log
               where
                    log.UtcTimestamp < :threshold and
                    log.Configuration.Application = :application";

session.CreateQuery(hql)
       .SetDateTime("threshold", threshold)
       .SetEnum("application", this.application)
       .ExecuteUpdate();

نفس الشكل من الاستعلام يعمل عند استخدامه في Select:

string hql = @"from MyLog log
               where
                    log.UtcTimestamp < :threshold and
                    log.Configuration.Application = :application";
IList<MyLog> log = session.CreateQuery(hql)
    .SetDateTime("threshold", threshold)
    .SetEnum("application", this.application)
    .List<MyLog>();

يحتوي تعيين mylog على:

References(x => x.Configuration)
     .Columns("CONFIGURATION_ID")
     .ReadOnly();      

يحتوي تعيين التكوين على:

Map(x => x.Application, "APPLICATION_ID");

الخطأ الذي أحصل عليه هو:

حذف من mylog ، التكوين counterCon1_ حيث utc_timestamp <: p0 و application_id =: p1 ؛ : p0 = 04/10/2010 17:15:52 ،: p1 = 7

nhibernate.exceptions.genericadoexception: لا يمكن تنفيذ استعلام التحديث [SQL:

حذف من mylog ، التكوين counterCon1_ حيث utc_timestamp <؟ و Application_id =؟

] ---> oracle.dataaccess.client.oraclexception: ORA-00933: أمر SQL لم ينته بشكل صحيح

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

المحلول

جرب هذا:

delete MyLog log
where log.id in
          (select l.id
           from MyLog l
           where l.UtcTimestamp < :threshold and
           and.Configuration.Application = :application)

نصائح أخرى

من الرابط المقدم من رافائيل أعلاه:

http://docs.jboss.org/hibernate/stable/core/reference/en/html/batch.html#batch-direct

لا يمكن تحديد أي صلة ، إما ضمنية أو صريحة ، في استعلام HQL بالجملة. يمكن استخدام القذيفة الفرعية في البكل ، حيث قد تحتوي الغزوات الفرعية نفسها على صناديق

بناء الجملة DELETE FROM MyLog ....

ضع في اعتبارك أن HQL Delete لا تكريم Cascades المحددة مع (N) تعيينات السبات.

حتى تتمكن من تحديد جميع الكيانات وحذفها واحدًا تلو الآخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top