2014-10-02 70 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