2009-08-11 6 views
18

Qual è il modo consigliato di troncare una tabella usando hibernate/hql?Utilizzare hibernate/hql per troncare una tabella?

Ho provato questo:

 
Query query = session.createQuery("truncate table MyTable"); 
query.executeUpdate(); 

Ma non ha funzionato (troncato non sembra non essere documentato in qualsiasi parte HQL ...)

+2

Tronca non è un LMD standard o comando DDL, quindi è normale che non è supportato. –

risposta

11

immagino un modo orribile di fare cancellerebbe tutto.

public int hqlTruncate(String myTable){ 
    String hql = String.format("delete from %s",myTable); 
    Query query = session.createQuery(hql); 
    return query.executeUpdate(); 
} 
+0

Ho finito per usare questo dato che di solito ho solo una ventina di dischi da cancellare alla volta ... Grazie! – user149100

+14

truncat! = Delete –

+2

@stunaz Sure truncat! = Delete ma la soluzione qui è un compromesso – Stephan

33

È possibile utilizzare session.createSQLQuery() invece:

session.createSQLQuery("truncate table MyTable").executeUpdate(); 

Inutile dire che questo non è l'ideale in termini di portabilità. Probabilmente è una buona idea definire questa query nel mapping e recuperarla nel codice come query con nome.

+2

Nota 'createNativeQuery' è preferita dopo la versione 5.2 – aristotll

5

Ho usato la sintassi di eliminazione in un HQL per mantenere la portabilità. Funziona alla grande:

public abstract class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> { 

private Class<T> persistentClass; 

// Balance of dao methods snipped... :) 

/** 
* Clears all records from the targetted file. 
* @throws DAOException 
*/ 
public int truncate() throws DAOException { 
    Session s = getSession(); 
    int rowsAffected = 0; 
    try { 
     Class c = getPersistentClass(); 
     String hql = "delete from " + c.getSimpleName(); 
     Query q = s.createQuery(hql); 
     rowsAffected = q.executeUpdate(); 
    } catch (HibernateException e) { 
     throw new DAOException("Unable to truncate the targetted file.", e); 
    } 
    return rowsAffected; 
} 
/** 
* Returns a Class object that matches target Entity. 
* 
* @return Class object from constructor 
*/ 
public Class<T> getPersistentClass() { 
    return persistentClass; 
} 

Funziona alla grande e completamente tronca la tabella di destinazione. Usare con cautela poiché il server db eseguirà questa affermazione con grande efficienza ... :)

13

fare attenzione, troncare ed eliminare istruzioni SQL totalmente separate: - eliminare è DML e troncare è DDL, il che significa che è possibile eliminare rollback e non è possibile eseguire il rollback del troncato - elimina deve trovare ogni riga una per una. troncare è istantanea - cancellare usi annullare i log e troncano non fa

se si mette tutto insieme: 1/se si vuole che sia rollbackable, non si vuole usare troncare 2/se si utilizza eliminare , data la dimensione del tavolo che vuoi svuotare: - se il tavolo è piccolo, non vedrai alcuna differenza - se il tavolo è di medie dimensioni, subirai una cattiva prestazione - se il tavolo è grande, finirai senza spazio nel tablespace annullare e non sarà possibile svuotare nulla

quindi fare attenzione a quale dichiarazione si desidera veramente utilizzare.

su come troncare una tabella con hql, dovrebbe essere vietato eseguire DDL (troncare, creare tabella, drop table, ecc.) Da e applicazione. Dovresti usare delete. Ma se il tavolo è grande, non funzionerà neanche. Ecco perché svuotare una tabella in un'applicazione è in generale una cattiva idea. Se si desidera eseguire alcune operazioni di pulizia, è spesso preferibile eseguire il troncato all'interno di uno script sql una volta ogni notte.

Si noti che io non conosco le specifiche della vostra applicazione e che si sta parlando solo in generale