2009-08-11 79 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会更好。

请注意,我不知道你的应用程序的细节,它只是一般