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      

] --->   Oracle.DataAccess.Client.OracleException:   ORA-00933: SQL-Befehl nicht richtig   beendet

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top