20

hibernate/hql を使用してテーブルを切り捨てるための推奨される方法は何ですか?

私はこれを試しました:

クエリ query = session.createQuery("truncate table MyTable");
 query.executeUpdate();

しかし、それはうまくいきませんでした (truncate は hql のどこにも文書化されていないようです...)

4

6 に答える 6

43

代わりに使用できますsession.createSQLQuery()

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

言うまでもなく、これは移植性の点で理想的ではありません。このクエリをマッピングで定義し、名前付きクエリとしてコードで取得することをお勧めします。

于 2009-08-11T20:36:48.237 に答える
20

注意してください。切り捨てと削除は完全に別の SQL ステートメントです。

  • delete は DML で、truncate は DDL です。つまり、delete はロールバックでき、truncate はロールバックできません。
  • delete は、各行を 1 つずつ検索する必要があります。切り捨ては瞬時です
  • delete は undo ログを使用し、truncate は使用しません

すべてをまとめると:

  1. ロールバック可能にしたい場合は、切り捨てを使用したくない
  2. 空にしたいテーブルのサイズを考慮して、削除を使用する場合:
    • テーブルが小さい場合、違いはわかりません
    • テーブルのサイズが中程度の場合、パフォーマンスが低下します
    • テーブルが大きい場合、UNDO テーブルスペースのスペースが不足し、何も空にすることができなくなります。

したがって、実際に使用したいステートメントに注意してください。

hql を使用してテーブルを切り捨てる方法については、アプリケーションから DDL (切り捨て、テーブルの作成、テーブルの削除など) を実行することを禁止する必要があります。削除を使用する必要があります。ただし、テーブルが大きい場合も機能しません。そのため、アプリケーションでテーブルを空にすることは、一般に悪い考えです。クリーニングを行いたい場合は、多くの場合、毎晩 1 回、SQL スクリプト内で truncate を実行することをお勧めします。

私はあなたのアプリケーションの詳細を知らないことに注意してください.

于 2010-05-28T12:54:20.890 に答える
16

それを行う恐ろしい方法は、すべてを削除することだと思います。

public int hqlTruncate(String myTable){
    String hql = String.format("delete from %s",myTable);
    Query query = session.createQuery(hql);
    return query.executeUpdate();
}
于 2009-08-11T20:31:13.787 に答える
4

移植性を維持するために、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;
}

うまく機能し、対象のテーブルを完全に切り捨てます。データベースサーバーはこのステートメントを非常に効率的に実行するため、注意して使用してください... :)

于 2010-02-14T10:11:14.940 に答える
0

次の方法で実行できます。

    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());
            }
        });
    }
于 2020-09-04T19:29:20.427 に答える