2014-10-02 4 views
-1

Привет, хочу удалить миллионы строк из таблицы в пакетном режиме, чтобы избежать блокировки. Я пытаюсь сделать код ниже, но его удаление всех строк.Hiberate удалять строки из таблицы с ограничением

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();" возвращает имя таблицы.

Если это так, как ваш запрос - «удалить из« tablename »» здесь вы не указываете никаких условий, которые ограничивают оператор delete, поэтому он удаляет все строки из таблицы.

Как вы используете setFetchSize - setFetchSize (int value) является «подсказкой» для драйвера, сообщая ему, сколько строк оно должно извлечь.

Я думаю, что этот метод не требуется в случае запроса на удаление.

+0

Да, я попробовал «удалить из tablename limit 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

+0

старайтесь избегать setFetchsize (limit). Этот метод используется, чтобы указать, сколько строк вы хотите извлечь, но в вашем случае вы пытаетесь удалить строки, которые не извлекают их. – Moni

+0

Спасибо Moni Я удалил эту часть, но есть ли способы указать количество строк для удаления? – plzdontkillme

Смежные вопросы