3

次の 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 から削除、CONFIGURATION countercon1_ where UTC_TIMESTAMP<:p0 and APPLICATION_ID=:p1; :p0 = 2010 年 4 月 10 日 17:15:52、:p1 = 7

NHibernate.Exceptions.GenericADOException: 更新クエリを実行できませんでした [SQL:

MYLOG から削除、CONFIGURATION countercon1_ どこで UTC_TIMESTAMP< ? および APPLICATION_ID= ?

] ---> Oracle.DataAccess.Client.OracleException: ORA-00933: SQL コマンドが正しく終了しませんでした

4

3 に答える 3

5

これを試して:

delete MyLog log
where log.id in
          (select l.id
           from MyLog l
           where l.UtcTimestamp < :threshold and
           and.Configuration.Application = :application)
于 2010-10-06T15:35:16.993 に答える
3

上記のラファエルによって送信されたリンクから:

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

一括 HQL クエリでは、暗黙的または明示的な結合を指定できません。サブクエリは、サブクエリ自体に結合を含めることができる where 句で使用できます。

于 2010-10-05T14:44:51.267 に答える
2

構文は次のとおりです。DELETE FROM MyLog ....

HQL 削除は、(n) hibernate マッピングで定義されたカスケードを尊重しないことに注意してください。

したがって、すべてのエンティティを選択して、1 つずつ削除できます。

于 2010-10-05T12:03:02.207 に答える