2012-01-22 3 views
30

У меня есть таблица для студентов и вы хотите удалить всех учеников в классе.Как удалить по критериям в спящем режиме?

Так что мой SQL запрос будет выглядеть следующим образом:

delete from student where classId = 333 

Как я могу сделать это, используя спящий режим с критериями?

Мне нужно это, поэтому я могу поместить в один из моих базовых классов, чтобы использовать любые объекты DAO, которые простираются от него. Поэтому я могу сделать этот родословный во всех своих объектах DAO.

В настоящее время я создал общий метод, который будет подан в Student Object - вызывает метод находки, которая использует критерии, чтобы получить список, а затем я партия удалять по одной сделке следующим образом:

public boolean deleteByCriteria(Object deleteObject) { 
    List deleteObjectList = find(deleteObject); 
    if (deleteObjectList == null) 
     return false; 
    return deleteAll(deleteObjectList); 
} 

public boolean deleteAll(List deleteObjectList) { 
    if (logger.isDebugEnabled()) { 
     logger.debug("Entered BaseSchoolRollBookDAO -> delete"); 
     logger.debug("Object for batch deletion [" + deleteObjectList + "]"); 
    } 
    boolean result = false; 
    Transaction tx = null; 
    // Get CurrentSession from HibernateUtils 
    Session session = HibernateUtils.getSession(); 
    // Start transaction 
    tx = session.beginTransaction(); 

    // Create new Criteria to be passed 
    try { 
     int flushCount = 0; 
     for (Object deleteObject : deleteObjectList) { 
      session.delete(deleteObject); 
      flushCount++; 

      if (flushCount % 20 == 0) { 
       session.flush(); 
       session.clear(); 
      } 
     }   

     tx.commit(); 
     result = true; 
    } catch (HibernateException e) { 
     logger.fatal("Exception in executing batch Delete query", e); 
     if (tx != null && tx.isActive()) 
      tx.rollback(); 
    } 
    return result; 
} 
+1

Интересно, удалит ли в цикле проблемы с производительностью? – muhamadto

ответ

65

для удаляемого использовать HQL, который лучший вариант, я думаю, главная цель КРИТЕРИИ является только для извлечения данных.
Это один с Criteria

Student student = (Student) session.createCriteria(Student.class) 
        .add(Restrictions.eq("classId", classId)).uniqueResult(); 
    session.delete(student); 

И это один простой HQL запрос:

String hql = "delete from Student where classId= :classId"; 
session.createQuery(hql).setString("classId", classId).executeUpdate(); 
+1

Просто записка для других людей. Если вы используете версию Hibernate, предложенную Jamshid, вам все равно нужно сохранить транзакцию: tx = session.beginTransaction(); а затем выполните фиксацию: tx.commit(); чтобы заставить его работать. – ForceMagic

+1

Действительно ли эти критерии работают? Это выглядит странно, заставляя ученика как uniqueResult затем удалять это. – Lyrion

+1

Я отошел от Hibernate и жалею, что оставил этот комментарий после очень долгого времени, но я не думаю, что приведенный выше пример критериев спящего режима будет работать, потому что это основная причина, почему я задал этот вопрос и почему я должен был сделать так, как я Я делаю это в своем примере. – chan

8

Вы можете легко достигнуть, следуя простой спящий режим следующим образом,

Session session=getSession(); 
String hql = "delete from Student where classId= :id"; 
session.createQuery(hql).setLong("id", new Integer(id)).executeUpdate(); 

для деталей refer

0
/** 
* 
* @param objects 
*/ 
public static void deleteAll(List<?> objects) { 

      try { 
       HibernateEntityManager em = JPA.em().unwrap(HibernateEntityManager.class); 
       Session session = em.getSession(); 
       for (Object o : objects) { 
        session.delete(o); 
       } 
      } catch (Exception e) { 
       Logger.error("CommonHibernateBD_deleteAll error: " + e); 
       e.printStackTrace(); 
      } 

    } 
-1

Сначала вам нужна форма с вводом, значение ввода - это модель, которую вы смоделировали в modelmap, чем make delete в некоторой ссылке. чем получить идентификатор параметра, с @requestparam («ID») Строка идентификатора

знаю, что мы получили идентификатор объекта , а затем удалить идентификатор например

@RequestMapping(value="delsubloc",method=RequestMethod.GET) 
    public String DeleteLoc(@RequestParam("id")Long id) { 
     PplLocDtlDAO dtl = new PplLocDtlDAO(); 
     PplLocDtl loc = new PplLocDtl(); 
     loc.setLocDtlId((long)id); 
     dtl.delete(loc); 
     return "redirect:/lokasi"; 
    } 
2

Этот способ является лучшим и лучше, чем ответ @Jama Asatillayev. Поскольку вам не нужно сначала извлекать постоянный объект.

Product product = new Product(); 
product.setId(37); 
session.delete(product); 

И спящий режим будет работать:

Hibernate: delete from PRODUCT where PRODUCT_ID=? 

Подробнее: http://www.codejava.net/frameworks/hibernate/hibernate-basics-3-ways-to-delete-an-entity-from-the-datastore

+1

Ну, это не отвечает прямо на вопрос «Как я могу это сделать с помощью Hibernate с критериями?» ... но реализует простейшее решение pure-Hibernate для удаления единого объекта по id. – Lambart

+1

@ Lambart Вы правы, но, вероятно, «с критериями» означает «Я хочу использовать объекты» здесь. Поэтому я держу ответ. –

3

Вы должны обновить версию гибернации до версии, которая реализует JPA 2.1 (Hibernate начинается JPA 2.1 на версии 4.3.11 .Final - Hibernate Downloads)

После того, как вы обновили, вы можете использовать CriteriaDelete делать то, что вы хотите. вот небольшой пример: Example

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