لماذا يفشل حذف HQL هذا ، عندما يعمل HQL مع نفس المصطلحات؟
-
27-09-2019 - |
سؤال
لماذا يفشل استعلام 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) تعيينات السبات.
حتى تتمكن من تحديد جميع الكيانات وحذفها واحدًا تلو الآخر.