Почему этот HQL удаляет неудачу, когда работает HQL с тем же условиями?

StackOverflow https://stackoverflow.com/questions/3863309

Вопрос

Почему следующие запросы 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) сопоставлениями с гибернацией.

Таким образом, вы можете выбрать все объекты и удалить их один за другим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top