¿Por qué este HQL delete fallan, cuando un HQL seleccionar con los mismos términos obras?
-
27-09-2019 - |
Pregunta
¿Por qué la siguiente consulta HQL fallar?
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 misma forma de consulta funciona cuando se utiliza en un selecto:
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>();
El mapeo para MyLog contiene:
References(x => x.Configuration)
.Columns("CONFIGURATION_ID")
.ReadOnly();
El mapeo para la configuración contiene:
Map(x => x.Application, "APPLICATION_ID");
El error que consigo es:
eliminar de mylog, CONFIGURACIÓN countercon1_ donde UTC_TIMESTAMP <: p0 y APPLICATION_ID = p1; : P0 = 04/10/2010 17:15:52,: p1 = 7
NHibernate.Exceptions.GenericADOException: No se pudo ejecutar consulta de actualización [SQL:
eliminar de mylog, CONFIGURACIÓN countercon1_ donde UTC_TIMESTAMP y APPLICATION_ID =?
] ---> Oracle.DataAccess.Client.OracleException: ORA-00933: no ordena correctamente SQL terminado
Solución
Prueba esto:
delete MyLog log
where log.id in
(select l.id
from MyLog l
where l.UtcTimestamp < :threshold and
and.Configuration.Application = :application)
Otros consejos
Desde el enlace presentado por Rafael arriba:
http: // docs. jboss.org/hibernate/stable/core/reference/en/html/batch.html#batch-direct
No se une, ya sea implícita o explícita, se puede especificar en una consulta HQL mayor. Sub-consultas se pueden utilizar en el donde cláusula, donde las subconsultas a su vez pueden contener une
La sintaxis es DELETE FROM MyLog ....
Tenga en cuenta que HQL borrado no está cascadas de honor definidos con (n) de hibernación asignaciones.
Así que usted puede seleccionar todas las entidades y eliminarlos uno por uno.