Используя hibernate/hql для усечения таблицы?

Вы могли бы хотеть изучить Sgen.exe инструмент, который идет с.NET. Существует также удобная небольшая вещь на странице "Build" свойств проекта Visual Studio C#, в самой нижней части, названной "Блок сериализации сборки", который автоматически работает Sgen за Вами.

19
задан user149100 11 August 2009 в 20:27
поделиться

4 ответа

Я полагаю, что ужасный способ сделать это - удалить все.

public int hqlTruncate(String myTable){
    String hql = String.format("delete from %s",myTable);
    Query query = session.createQuery(hql);
    return query.executeUpdate();
}
11
ответ дан 30 November 2019 в 02:02
поделиться

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

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

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

38
ответ дан 30 November 2019 в 02:02
поделиться

Я использовал синтаксис delete в 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;
}

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

4
ответ дан 30 November 2019 в 02:02
поделиться

Будьте осторожны, truncate и delete - это совершенно разные sql-запросы:

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

Если сложить все это вместе:

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

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

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

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

17
ответ дан 30 November 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: