Каков рекомендуемый способ обрезания таблицы с помощью hibernate/hql?
Я пробовал это:
Query query = session.createQuery("truncate table MyTable"); query.executeUpdate();
Но это не сработало (truncate, похоже, не документируется нигде в hql...)
Каков рекомендуемый способ обрезания таблицы с помощью hibernate/hql?
Я пробовал это:
Query query = session.createQuery("truncate table MyTable"); query.executeUpdate();
Но это не сработало (truncate, похоже, не документируется нигде в hql...)
Я предполагаю, что ужасный способ сделать это будет удалять все.
public int hqlTruncate(String myTable){
String hql = String.format("delete from %s",myTable);
Query query = session.createQuery(hql);
return query.executeUpdate();
}
Вместо этого вы можете использовать session.createSQLQuery()
:
session.createSQLQuery("truncate table MyTable").executeUpdate();
Излишне говорить, что это не идеально с точки зрения переносимости. Вероятно, это хорошая идея, чтобы определить этот запрос при сопоставлении и получить его в коде как именованный запрос.
Будьте осторожны, усечение и удаление - это совершенно отдельные операторы SQL:
Если сложить все вместе:
так что будьте осторожны с тем, какое утверждение вы действительно хотите использовать.
Что касается усечения таблицы с помощью hql, следует запретить запуск DDL (усечение, создание таблицы, удаление таблицы и т.д.) Из приложения и из него. Вы должны использовать удалить. Но если стол большой, он тоже не будет работать. Поэтому очистка таблицы в приложении - вообще плохая идея. Если вы хотите выполнить некоторую очистку, часто лучше запускать truncate внутри сценария sql один раз каждую ночь.
Обратите внимание, что я не знаю специфику вашего приложения и что оно говорит только в целом.
Я использовал синтаксис 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 будет выполнять это утверждение с большой эффективностью...:)
Предотвращение SQL-инъекций вы можете использовать:
String escapedSQL = StringEscapeUtils.escapeSql(unescapedSQL);