2014-10-02 65 views
-1

希望批量删除数百万行以避免锁定。我在下面的代码,但它删除所有的行。从表中删除有限制的行

Session session; 
    try { 
     session = dao.getHibernateTemplate().getSessionFactory().getCurrentSession(); 
    } catch (HibernateException e) { 
     session = dao.getHibernateTemplate().getSessionFactory().openSession(); 
    } 
    String sql = "delete from "+clazz.getSimpleName(); 
    session.createQuery(sql).setFetchSize(limit).executeUpdate(); 
    dao.getHibernateTemplate().flush(); 

是否有这样做

回答

2

我正在考虑什么更好的办法 “clazz.getSimpleName();”正在返回一个表名。

如果是这种情况,而不是您的查询 - “从表'中删除'”,您没有指定任何限制删除语句的条件,这就是为什么它会删除表中的所有行。

正如你所使用的setFetchSize - setFetchSize(int value)是驱动程序的'提示',告诉它应该读取多少行。

我觉得这个方法在删除查询的情况下是不需要的。

+0

是的,我试过“从表名限制100删除”,但给我java.lang.IllegalArgumentException:节点遍历不能为空! \t在org.hibernate.hql.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:63) \t在org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:280) \t在org.hibernate作为.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182) – plzdontkillme 2014-10-02 22:02:48

+0

尽量避免setFetchsize(limit)。此方法用于告知要提取多少行,但在您的情况下,您试图删除不提取它的行。 – Moni 2014-10-02 22:10:33

+0

感谢Moni我删除了那部分,但有什么方法可以指定要删除的行数? – plzdontkillme 2014-10-02 23:08:06