使用hibernate/hql截断表?

use*_*100 19 hibernate truncate hql

使用hibernate/hql截断表的推荐方法是什么?

我试过这个:

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

但它没有用(截断似乎没有在hql中的任何地方记录...)

Chs*_*y76 38

你可以session.createSQLQuery()改用:

session.createSQLQuery("truncate table MyTable").executeUpdate();
Run Code Online (Sandbox Code Playgroud)

毋庸置疑,就便携性而言,这并不理想.在映射中定义此查询并在代码中将其作为命名查询进行检索可能是个好主意.

  • 注意在5.2版之后首选`createNativeQuery` (2认同)

jel*_*leb 17

小心,截断和删除是完全独立的sql语句: - 删除是DML,truncate是DDL,这意味着删除可以回滚,截断不能回滚 - 删除必须逐个查找每一行.truncate是瞬时的 - 删除使用撤消日志而截断则不是

如果你把它们放在一起:1 /如果你想要它可以回滚,你不想使用truncate 2 /如果你使用delete,给定你要清空的表的大小: - 如果表很小你将看到没有区别 - 如果表中等大小,您将遇到性能不佳 - 如果表很大,您将在撤消表空间中耗尽空间,并且您将无法清空任何内容

所以要小心你真正想要使用的陈述.

至于如何使用hql截断表,应该禁止从应用程序运行DDL(截断,创建表,删除表等).你应该使用删除.但如果表格很大,它也不会起作用.这就是为什么清空应用程序中的表通常是一个坏主意.如果你想做一些清理,通常最好每晚在sql脚本中运行一次truncate.

请注意,我不知道您的应用程序的具体细节,并且它只是在谈论


Tom*_*Tom 11

我想这样做的可怕方法就是删除所有内容.

public int hqlTruncate(String myTable){
    String hql = String.format("delete from %s",myTable);
    Query query = session.createQuery(hql);
    return query.executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)

  • truncat!=删除 (16认同)
  • @stunaz Sure truncat!=删除,但这里的解决方案是妥协 (2认同)