2009-08-11 77 views
18

推薦使用hibernate/hql截斷表的方法是什麼?使用hibernate/hql截斷表?

我已經試過這樣:

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

但它沒有工作(截斷似乎沒有被做在HQL記錄任何地方...)

+2

截斷說話是不是一個標準的DML或DDL命令,因此是正常的,它不支持。 – 2009-12-08 17:47:41

回答

11

我想這樣做的一個可怕的方式它會刪除所有。

public int hqlTruncate(String myTable){ 
    String hql = String.format("delete from %s",myTable); 
    Query query = session.createQuery(hql); 
    return query.executeUpdate(); 
} 
+0

我結束了使用這個,因爲我通常只有20個左右的記錄刪除在一次...謝謝! – user149100 2009-08-12 16:14:46

+14

truncat!=刪除 – 2011-11-23 19:31:09

+2

@stunaz確定truncat!=刪除,但這裏的解決方案是妥協 – Stephan 2011-12-06 16:49:38

33

您可以使用session.createSQLQuery()代替:

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

不用說,這是不是在便攜性方面的理想選擇。在映射中定義此查詢並在代碼中將其作爲命名查詢進行檢索可能是一個好主意。

+2

注意'createNativeQuery'優先於5.2版本 – aristotll 2017-09-08 10:16:21

5

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

工程很好,完全截斷目標表。請謹慎使用,因爲您的數據庫服務器將以極高的效率執行此語句... :)

13

要小心,截斷和刪除是完全獨立的sql語句: - 刪除是DML,截斷是DDL,這意味着刪除可以被回滾並且截斷不能被回滾 - 刪除必須逐一找到每一行。截斷是瞬間 - 刪除使用撤銷日誌並截斷不

,如果你把它放在一起: 1 /如果你希望它是rollbackable,你不希望如果你使用刪除使用截斷 2/,給定您想要清空的表格的大小: - 如果表格很小,您將看不到任何區別 - 如果表格的大小適中,您將遇到性能不佳的情況 - 如果表格很大,您將用完在撤消表空間中的空間,你將無法清空任何東西

所以要小心你真的想使用什麼聲明。

至於如何用hql截斷表,應禁止從和應用程序運行DDL(截斷,創建表,刪除表等)。你應該使用刪除。但是如果桌子很大,它也不會工作。 這就是爲什麼清空應用程序中的表格通常是一個壞主意。 如果你想做一些清理,通常每天晚上在一個sql腳本中運行truncate會更好。

請注意,我不知道你的應用程序的細節,它只是一般