2012-01-22 13 views
30

Mam tabelę studentów i chcę usunąć wszystkich uczniów z klasy.Jak usunąć według kryteriów w stanie hibernacji?

Więc moje zapytanie SQL wyglądałby następująco:

delete from student where classId = 333 

jaki sposób można zrobić to za pomocą hibernacji kryteria?

Potrzebuję tego, abym mógł umieścić w jednej z moich klas bazowych do użycia przez dowolne obiekty DAO, które się od niego rozciągają. Mogę zrobić to ogólne we wszystkich moich obiektach DAO.

Obecnie stworzyliśmy metody rodzajowe, które będą podjęte w obiekcie student - wywołuje metodę find który wykorzystuje kryteria, aby otrzymać listę, a potem ja partia usunąć w ramach jednej transakcji w sposób następujący:

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

Zastanawiam się, czy usunięcie w pętli spowoduje problemy z wydajnością? – muhamadto

Odpowiedz

65

dla usuwanie użytkowania HQL który najlepszym rozwiązaniem, myślę, głównym celem kryteria jest tylko dla pobierania dane.
Ten jest z Criteria

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

i ten jest prosty HQL kwerendy:

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

Tylko uwaga dla innych ludzi. Jeśli używasz wersji Hibernate sugerowanej przez Jamshid, nadal musisz przechowywać transakcję: tx = session.beginTransaction(); a następnie wykonaj commit: tx.commit(); aby to działało. – ForceMagic

+1

Czy te kryteria rzeczywiście działają? Wygląda to dziwnie, kiedy uczeń staje się wyjątkowy, a następnie usuwa go. – Lyrion

+1

Oddaliłem się od Hibernate i przepraszam, że wstawiłem ten komentarz po naprawdę długim czasie, ale nie sądzę, aby powyższy przykład kryterium hibernacji zadziałał, ponieważ jest to główny powód, dla którego zadałem to pytanie i dlaczego musiałem postąpić tak, robię to na moim przykładzie. – chan

8

można łatwo osiągnąć, wykonując proste hibernacji w następujący sposób,

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

szczegółowe informacje 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

Najpierw potrzebujesz formularza z danymi wejściowymi, wartością wejściową jest model modelowany w mapie modelu, niż make delete w jakimś łączu. niż dostać parametr id, z @requestparam ("id") id String

wiedzieć mamy identyfikator obiektu a następnie usunąć np 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

Ta jest najlepsza i lepsza od odpowiedzi Asama Grajewlaya. Ponieważ nie trzeba najpierw pobierać trwałego obiektu.

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

i hibernacji będzie działać:

Hibernate: delete from PRODUCT where PRODUCT_ID=? 

Więcej szczegółów: http://www.codejava.net/frameworks/hibernate/hibernate-basics-3-ways-to-delete-an-entity-from-the-datastore

+1

Cóż, nie odpowiada bezpośrednio na pytanie "Jak zrobić to za pomocą Hibernacji z kryteriami?" ... ale implementuje najprostsze, czyste rozwiązanie Hibernate do usuwania pojedynczego obiektu według id. – Lambart

+1

@Lambart Masz rację, ale prawdopodobnie "z kryteriami" oznacza "Chcę używać obiektów" tutaj. Więc trzymam odpowiedź. –

3

należy uaktualnić wersję hibernacji do wersji 2.1, która implementuje JPA (Hibernate JPA 2.1 rozpoczyna się od wersji 4.3.11 .Final - Hibernate Downloads)

Po uaktualnieniu można użyć CriteriaDelete rób, co chcesz. tutaj jest mały przykład: Example

Powiązane problemy