2014-07-20 23 views
7

Próbuję uruchomić kwerendę aktualizującą, która będzie wyglądać tak w sql:Aktualizuj wiele wierszy na podstawie kryteriów hibernacji

update studentMaster set sess_status = 'G' where ACADEM_YEAR = COURSE_YEAR; 

próbuję ponownie utworzyć kwerendy przy użyciu kryteria tak:

public void updateSessionStatus() { 
     Session sess = factory.openSession(); 
     Transaction tx = null; 
     try { 
      tx = sess.beginTransaction(); 
      Criteria crit = sess.createCriteria(CollegeStudentsMaster.class); 
      crit.add(Restrictions.eqProperty("academicYear", "courseYears")); 
      CollegeStudentsMaster e = (CollegeStudentsMaster) crit.uniqueResult(); 
      e.setSessionStatus("G"); 
      sess.saveOrUpdate(e); 
      tx.commit(); 
     } catch (HibernateException asd) { 
      if (tx != null) { 
       tx.rollback(); 
      } 
      log.debug(asd.getMessage()); 
     } finally { 
      sess.close(); 
     } 
    } 

To nie działa, ponieważ wiersze spełniające te kryteria są liczne, moim jedynym wynikiem jest tutaj problem. Jak mogę przekonwertować to na aktualizację dla wszystkich wierszy spełniających kryteria. Nie chcę używać kwerendy HQL, raczej robię to z Kryteriami.

Odpowiedz

8
public void updateSessionStatus() { 
     Session sess = factory.openSession(); 
     Transaction tx = null; 
     try { 
      tx = sess.beginTransaction(); 
      Criteria crit = sess.createCriteria(CollegeStudentsMaster.class); 
      crit.add(Restrictions.eqProperty("academicYear", "courseYears")); 
      // Here is updated code 
      ScrollableResults items = crit.scroll(); 
      int count=0; 
      while (items.next()) { 
       CollegeStudentsMaster e = (CollegeStudentsMaster)items.get(0); 
       e.setSessionStatus("G"); 
       sess.saveOrUpdate(e); 
       if (++count % 100 == 0) { 
        sess.flush(); 
        sess.clear(); 
       } 
      } 
      tx.commit(); 
     } catch (HibernateException asd) { 
      if (tx != null) { 
       tx.rollback(); 
      } 
      log.debug(asd.getMessage()); 
     } finally { 
      sess.close(); 
     } 
    } 

To jest zawsze sugerują, że wykonywanie operacji zbiorczych bardzo zbliżone do bazy danych i nie musimy zachować zaktualizowaną obiekt w sesji, o ile nie są wymagane, dlatego starają się unikać obciążeń obiektów w sesji podczas wykonywania operacji zbiorczych.

+0

Dzięki, że zadziałało. – ErrorNotFoundException

Powiązane problemy