Domanda

Perché il seguente HQL Query fallire?

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 stessa forma di query funziona se usato in un prescelto:

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>();

La mappatura per MyLog contiene:

References(x => x.Configuration)
     .Columns("CONFIGURATION_ID")
     .ReadOnly();      

La mappatura per la configurazione contiene:

Map(x => x.Application, "APPLICATION_ID");

L'errore che ottengo è:

  

eliminare dalla mylog, CONFIGURAZIONE   countercon1_ dove UTC_TIMESTAMP <: p0   e APPLICATION_ID = p1; : P0 =   04/10/2010 17:15:52, p1 = 7

     

NHibernate.Exceptions.GenericADOException:   Non potrebbe eseguire query di aggiornamento [SQL:

     

eliminare dalla mylog, CONFIGURAZIONE   countercon1_ dove UTC_TIMESTAMP      

] --->   Oracle.DataAccess.Client.OracleException:   ORA-00933: non comando SQL correttamente   conclusa

È stato utile?

Soluzione

Prova questo:

delete MyLog log
where log.id in
          (select l.id
           from MyLog l
           where l.UtcTimestamp < :threshold and
           and.Configuration.Application = :application)

Altri suggerimenti

Dal link presentata da Rafael sopra:

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

  

Non si unisce, sia implicita o esplicita,   può essere specificata in una query HQL bulk.   Sub-query possono essere utilizzati in   dove clausola, dove le sottoquery   stessi possono contenere unisce

La sintassi è DELETE FROM MyLog ....

avere in mente che HQL Elimina non cascate d'onore definiti con (n) ibernazione mappature.

Quindi, è possibile selezionare tutte le entità e cancellare uno per uno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top