Почему этот 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();
Такая же форма запроса работает при использовании в выборе:
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 и apadement_id =: p1; : p0 = 04/10/2010 17:15:52 ,: p1 = 7
Nhibernate.exceptions.genericadoException: не удалось выполнить запрос обновления [SQL:
Удалить из MyLog, конфигурацию Countercon1_ Откуда utc_timestamp <? и application_id =?
] ---> Oracle.dataaccess.client.OracleException: 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 не почет каскады, определенные с (N) сопоставлениями с гибернацией.
Таким образом, вы можете выбрать все объекты и удалить их один за другим.