2012-01-22 11 views
30

Ho una tabella studenti e voglio eliminare tutti gli studenti in una classe.Come eliminare in base ai criteri in sospensione?

Quindi la mia domanda di SQL sarà simile:

delete from student where classId = 333 

Come posso fare questo usando Hibernate con criteri?

Ho bisogno di questo in modo da poter inserire una delle mie classi base da utilizzare da qualsiasi oggetto DAO che si estende da esso. Quindi posso renderlo generico su tutti i miei oggetti DAO.

Attualmente ho creato un metodo generico che preso in oggetto Student - richiama il metodo find che utilizza i criteri per ottenere l'elenco e poi faccio una partita a cancellare sotto una transazione come segue:

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

Mi chiedo, l'eliminazione di un ciclo causerà problemi di prestazioni? – muhamadto

risposta

65

per eliminazione uso HQL che è l'opzione migliore, credo, scopo principale dei criteri è esclusivamente per il recupero i dati.
Questo è con Criteria

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

E questo è semplice query HQL:

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

Solo una nota per altre persone. Se si utilizza la versione di Hibernate suggerita da Jamshid, è comunque necessario memorizzare la transazione: tx = session.beginTransaction(); e quindi eseguire un commit: tx.commit(); per farlo funzionare. – ForceMagic

+1

Questo criterio funziona davvero? Sembra strano, ottenere studenti come unici, quindi eliminarli. – Lyrion

+1

Mi sono allontanato da Hibernate e mi dispiace di aver inserito questo commento dopo molto tempo, ma non credo che l'esempio di ibernazione sopra riportato funzioni, perché questo è il motivo principale per cui ho fatto questa domanda e perché ho dovuto fare il modo in cui lo sto facendo nel mio esempio. – chan

8

Si può facilmente raggiungere seguendo semplice Hibernate come segue,

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

per i dettagli 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

Per prima cosa è necessario un modulo con input, il valore dell'input è il modello che è stato modellato in modelmap, rispetto a fare eliminare in qualche collegamento. di ottenere il parametro id, con @requestparam ("id") String id

sanno abbiamo ottenuto id dell'oggetto e quindi eliminare l'id esempio

@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

Questo è il modo migliore e migliore della risposta di @Jama Asatillayev. Perché non è necessario recuperare prima l'oggetto persistente.

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

E ibernazione verrà eseguito:

Hibernate: delete from PRODUCT where PRODUCT_ID=? 

Maggiori dettagli: http://www.codejava.net/frameworks/hibernate/hibernate-basics-3-ways-to-delete-an-entity-from-the-datastore

+1

Beh, non risponde direttamente alla domanda "Come posso farlo usando Hibernate con i criteri?" ... ma implementa la soluzione Hibernate più semplice e pura per l'eliminazione di una singola entità tramite id. – Lambart

+1

@Lambart Hai ragione ma probabilmente "con criteri" significa "Voglio usare gli oggetti" qui. Quindi tengo la risposta. –

3

Si dovrebbe aggiornare la versione Hibernate a una versione che implementa JPA 2.1 (Hibernate inizia JPA 2.1 alla versione 4.3.11 .Final - Hibernate Downloads)

Una volta aggiornato, è possibile utilizzare CriteriaDelete fare ciò che vuoi. ecco un piccolo esempio: Example

Problemi correlati