Использование hibernate / hql для усечения таблицы? - PullRequest
19 голосов
/ 12 августа 2009

Каков рекомендуемый способ усечения таблицы с помощью hibernate / hql?

Я пробовал это:

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

Но это не сработало (усечение, похоже, не документировано нигде в hql ...)

Ответы [ 4 ]

37 голосов
/ 12 августа 2009

Вы можете использовать session.createSQLQuery() вместо:

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

Излишне говорить, что это не идеально с точки зрения мобильности. Вероятно, было бы неплохо определить этот запрос в отображении и извлечь его в коде как именованный запрос.

16 голосов
/ 28 мая 2010

быть осторожным, усекать и удалять - это совершенно отдельные операторы SQL: - delete - DML, а truncate - DDL, что означает, что удаление можно откатить, а truncate нельзя откатить - Удалить должен найти каждую строку один за другим. усечь мгновенно - удаление использует журналы отмены, а усечение не

если сложить все вместе: 1 / если вы хотите, чтобы он был с возможностью отката, вы не хотите использовать усечение 2 / если вы используете delete, учитывая размер таблицы, которую вы хотите очистить: - если стол маленький, вы не увидите никакой разницы - если таблица среднего размера, вы будете испытывать плохую производительность - если таблица большая, вам не хватит места в табличном пространстве отмены, и вы не сможете ничего очистить

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

о том, как усекать таблицу с помощью hql, следует запретить запуск DDL (усечение, создание таблицы, удаление таблицы и т. Д.) Из приложения и из него. Вы должны использовать удалить. Но если стол большой, он тоже не будет работать. Вот почему очистка таблицы в приложении - плохая идея. Если вы хотите выполнить некоторую очистку, часто лучше запускать truncate внутри сценария sql раз в ночь.

Обратите внимание, что я не знаю специфику вашего приложения и что оно говорит только в общем

11 голосов
/ 12 августа 2009

Полагаю, ужасным способом было бы удалить все.

public int hqlTruncate(String myTable){
    String hql = String.format("delete from %s",myTable);
    Query query = session.createQuery(hql);
    return query.executeUpdate();
}
5 голосов
/ 14 февраля 2010

Я использовал синтаксис удаления в HQL для поддержки переносимости. Прекрасно работает:

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

Прекрасно работает и полностью усекает целевой стол. Используйте с осторожностью, так как ваш сервер БД выполнит это заявление с большой эффективностью ...:)

...