Почему происходит сбой удаления HQL, если работает выбор HQL с теми же условиями? - PullRequest
3 голосов
/ 05 октября 2010

Почему следующий 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();

Такая же форма запроса работает при использовании в select:

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 и APPLICATION_ID =: p1; : p0 = 10.04.2010 17:15:52,: p1 = 7 </p>

NHibernate.Exceptions.GenericADOException: не удалось выполнить запрос на обновление [SQL:

удалить из MYLOG, КОНФИГУРАЦИЯ countercon1_ где UTC_TIMESTAMP <? а также APPLICATION_ID =? </p>

] ---> Oracle.DataAccess.Client.OracleException: ORA-00933: команда SQL не правильно закончился

Ответы [ 3 ]

5 голосов
/ 06 октября 2010

Попробуйте это:

delete MyLog log
where log.id in
          (select l.id
           from MyLog l
           where l.UtcTimestamp < :threshold and
           and.Configuration.Application = :application)
3 голосов
/ 05 октября 2010

По ссылке, предоставленной Рафаэлем выше:

http://docs.jboss.org/hibernate/stable/core/reference/en/html/batch.html#batch-direct

В массовом запросе HQL нельзя указывать ни явные, ни явные объединения.Подзапросы могут использоваться в предложении where, где сами подзапросы могут содержать объединения

2 голосов
/ 05 октября 2010

Синтаксис DELETE FROM MyLog ....

Имейте в виду, что удаление HQL не учитывает каскады, определенные с (n) отображениями гибернации.

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

...