Warum löscht diese HQL scheitern, wenn ein HQL mit gleichen Bedingungen Werken wählen?
-
27-09-2019 - |
Frage
Warum wird die folgende HQL Abfrage fehlschlagen?
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();
Die gleiche Form der Abfrage funktioniert, wenn sie in einem ausgewählten verwendet:
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>();
Die Zuordnung für MyLog enthält:
References(x => x.Configuration)
.Columns("CONFIGURATION_ID")
.ReadOnly();
Die Zuordnung für Konfiguration enthält:
Map(x => x.Application, "APPLICATION_ID");
Der Fehler ich erhalte, ist:
Löschen von mylog, KONFIGURATION countercon1_ wo UTC_TIMESTAMP <: p0 und APPLICATION_ID =: p1; : P0 = 04/10/2010 17.15.52,: p1 = 7
NHibernate.Exceptions.GenericADOException: konnte nicht Update-Abfrage [SQL ausführen:
Löschen von mylog, KONFIGURATION countercon1_ wo UTC_TIMESTAMP und APPLICATION_ID =?
] ---> Oracle.DataAccess.Client.OracleException: ORA-00933: SQL-Befehl nicht richtig beendet
Lösung
Versuchen Sie diese:
delete MyLog log
where log.id in
(select l.id
from MyLog l
where l.UtcTimestamp < :threshold and
and.Configuration.Application = :application)
Andere Tipps
Von dem Link eingereicht von Rafael oben:
http: // docs. jboss.org/hibernate/stable/core/reference/en/html/batch.html#batch-direct
Nein beitritt, entweder implizit oder explizit, kann in einer Bulk-HQL-Abfrage angegeben werden. Unterabfragen können in die verwendet werden, where-Klausel, in der die Unterabfragen selbst können enthalten verbindet
Die Syntax ist DELETE FROM MyLog ....
Haben Sie daran, dass HQL nicht gelöscht Ehre Kaskaden definiert mit (n) Hibernate-Mappings.
So können Sie alle Elemente auswählen und sie nacheinander löschen.