Perché questo HQL delete non riescono, quando un HQL selezionare con gli stessi termini opere?
-
27-09-2019 - |
Domanda
Perché il seguente HQL Query fallire?
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();
La stessa forma di query funziona se usato in un prescelto:
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>();
La mappatura per MyLog contiene:
References(x => x.Configuration)
.Columns("CONFIGURATION_ID")
.ReadOnly();
La mappatura per la configurazione contiene:
Map(x => x.Application, "APPLICATION_ID");
L'errore che ottengo è:
eliminare dalla mylog, CONFIGURAZIONE countercon1_ dove UTC_TIMESTAMP <: p0 e APPLICATION_ID = p1; : P0 = 04/10/2010 17:15:52, p1 = 7
NHibernate.Exceptions.GenericADOException: Non potrebbe eseguire query di aggiornamento [SQL:
eliminare dalla mylog, CONFIGURAZIONE countercon1_ dove UTC_TIMESTAMP e APPLICATION_ID =?
] ---> Oracle.DataAccess.Client.OracleException: ORA-00933: non comando SQL correttamente conclusa
Soluzione
Prova questo:
delete MyLog log
where log.id in
(select l.id
from MyLog l
where l.UtcTimestamp < :threshold and
and.Configuration.Application = :application)
Altri suggerimenti
Dal link presentata da Rafael sopra:
http: // docs. jboss.org/hibernate/stable/core/reference/en/html/batch.html#batch-direct
Non si unisce, sia implicita o esplicita, può essere specificata in una query HQL bulk. Sub-query possono essere utilizzati in dove clausola, dove le sottoquery stessi possono contenere unisce
La sintassi è DELETE FROM MyLog ....
avere in mente che HQL Elimina non cascate d'onore definiti con (n) ibernazione mappature.
Quindi, è possibile selezionare tutte le entità e cancellare uno per uno.