Java 休眠并删除所有
在Hibernate中删除表中所有行的最佳方法是什么 如果我迭代一个集合并调用Java 休眠并删除所有,java,hibernate,sql-delete,Java,Hibernate,Sql Delete,在Hibernate中删除表中所有行的最佳方法是什么 如果我迭代一个集合并调用session.delete(),据我所知,它不会执行 如果我使用另一个选项session.createQuery(“删除…”)它不会影响持久性上下文 若并没有更好的变体,我什么时候应该使用这些方法?您可以使用HQL来截断表 String stringQuery = "DELETE FROM tablename"; Query query = session.createQuery(stringQuery); quer
session.delete()
,据我所知,它不会执行
如果我使用另一个选项session.createQuery(“删除…”)
它不会影响持久性上下文
若并没有更好的变体,我什么时候应该使用这些方法?您可以使用HQL来截断表
String stringQuery = "DELETE FROM tablename";
Query query = session.createQuery(stringQuery);
query.executeUpdate();
public int hqlTruncate(String myTable){
String hql = String.format("delete from %s",myTable);
Query query = session.createQuery(hql)
return query.executeUpdate();
}
- 如果没有要级联的内容,请使用HQL delete
delete FROM enityName
- 如果有级联,则迭代集合并逐个删除
如果性能非常关键(毕竟不是每天都会截断一个表),那么每个级联可以有超过1个HQL delete,即手动处理级联。为什么使用createQuery比在集合和调用会话上迭代要好。delete()?我对持久性上下文有问题吗?@feiroox:这样更好,因为当您迭代集合并调用delete时,它将删除一行和一行。这是一个很大的性能问题。然而,正如Bozho所说,如果你有级联,你可能会想这样做。如上所述,这不处理级联。我不知道是否有可能更强烈地强调这一点。我曾经浪费了很多时间,因为我认为运行HQL可以处理级联。它毕竟是Hibernate查询语言。但遗憾的是,事实并非如此。您必须执行session.delete(),但这会为每个记录发出一个SQL语句,这是非常低效的。这是最好的方法。您必须在query not表中写入java类文件的名称。不会级联删除,因此可能会违反fk约束。这不是截断。