¿Cuál es la forma recomendada para truncar una tabla usando hibernate/hql?

He intentado esto:

 Consulta = período de sesiones.createQuery("truncate table Mitabla"); 
consulta.executeUpdate(); 

Pero no funcionó (truncate no parece estar documentado en ninguna parte en hql…)

  • Truncate no es un estándar DML o comando DDL, por lo tanto es normal que no se admite.
InformationsquelleAutor user149100 | 2009-08-11

4 Comentarios

  1. 11

    Supongo que una horrible manera de hacerlo sería la eliminación de todas.

    public int hqlTruncate(String myTable){
        String hql = String.format("delete from %s",myTable);
        Query query = session.createQuery(hql);
        return query.executeUpdate();
    }
    • Terminé con esto ya que por lo general sólo tienen una veintena de registros para eliminar en un tiempo… Gracias!
    • truncat != eliminar
    • Seguro truncat!=eliminar pero la solución aquí es un compromiso
  2. 37

    Puede utilizar session.createSQLQuery() lugar:

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

    Huelga decir que esto no es lo ideal en términos de portabilidad. Es probablemente una buena idea para definir esta consulta en la asignación y recuperarla en el código como nombre de la consulta.

    • Nota createNativeQuery es preferido después de la versión 5.2
  3. 16

    hay que tener cuidado, truncar y eliminar son totalmente distintos instrucciones sql :
    – eliminar es DML y truncate es DDL, lo que significa que se puede eliminar rollbacked y truncate no puede ser rollbacked
    – eliminar tiene que encontrar cada fila de uno en uno. truncate es instantáneo
    – eliminar los usos deshacer los registros y truncate no

    si pones todo junto :
    1/si quieres ser rollbackable, usted no quiere usar truncate
    2/si utiliza eliminar, dado el tamaño de la tabla que desea vacío :
    – si la mesa es pequeña, usted no notará la diferencia
    – si la mesa es de tamaño medio, usted experimentará mal rendimiento
    – si la tabla es grande te quedarás sin espacio en el undo tablespace, y usted no será capaz de vaciar nada

    así que ten cuidado de lo que la declaración que usted realmente desea utilizar.

    cómo truncar una tabla con hql, debe ser prohibido para ejecutar DDL (trunca, create table, drop table, etc…) y de aplicación. Usted debe utilizar eliminar. Pero si la tabla es grande, no va a funcionar, ya sea.
    Es por eso que el vaciado de una tabla en una aplicación es en general una mala idea.
    Si usted desea hacer un poco de limpieza, a menudo es mejor para ejecutar truncar dentro de una secuencia de comandos sql una vez cada noche.

    Aviso que no sé los detalles de su aplicación y que es sólo hablando en general

  4. 5

    He utilizado la sintaxis delete en una HQL para mantener la portabilidad. Grandes obras:

    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;
    }

    Funciona muy bien y totalmente trunca la tabla de destino. Utilizar con precaución, ya que su servidor de db va a realizar esta declaración con gran eficiencia… 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here