hibernate/hql を使用してテーブルを切り捨てるための推奨される方法は何ですか?
私はこれを試しました:
クエリ query = session.createQuery("truncate table MyTable"); query.executeUpdate();
しかし、それはうまくいきませんでした (truncate は hql のどこにも文書化されていないようです...)
代わりに使用できますsession.createSQLQuery()
:
session.createSQLQuery("truncate table MyTable").executeUpdate();
言うまでもなく、これは移植性の点で理想的ではありません。このクエリをマッピングで定義し、名前付きクエリとしてコードで取得することをお勧めします。
注意してください。切り捨てと削除は完全に別の SQL ステートメントです。
すべてをまとめると:
したがって、実際に使用したいステートメントに注意してください。
hql を使用してテーブルを切り捨てる方法については、アプリケーションから DDL (切り捨て、テーブルの作成、テーブルの削除など) を実行することを禁止する必要があります。削除を使用する必要があります。ただし、テーブルが大きい場合も機能しません。そのため、アプリケーションでテーブルを空にすることは、一般に悪い考えです。クリーニングを行いたい場合は、多くの場合、毎晩 1 回、SQL スクリプト内で truncate を実行することをお勧めします。
私はあなたのアプリケーションの詳細を知らないことに注意してください.
それを行う恐ろしい方法は、すべてを削除することだと思います。
public int hqlTruncate(String myTable){
String hql = String.format("delete from %s",myTable);
Query query = session.createQuery(hql);
return query.executeUpdate();
}
移植性を維持するために、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;
}
うまく機能し、対象のテーブルを完全に切り捨てます。データベースサーバーはこのステートメントを非常に効率的に実行するため、注意して使用してください... :)
次の方法で実行できます。
try (Session session = sessionFactory.openSession()) {
session.doWork(connection -> {
try (PreparedStatement preparedStatement = connection.prepareStatement("TRUNCATE TABLE " + tableName)) {
preparedStatement.executeUpdate();
System.out.printf("Truncated table: %s%n", tableName);
} catch (SQLException e) {
System.err.printf("Couldn't truncate table %s: %s: %s%n", tableName, e, e.getCause());
}
});
}