2014-07-20 17 views
7

Tôi cố gắng để chạy một truy vấn cập nhật đó sẽ trông như thế này trong sql:Cập nhật nhiều hàng sử dụng Tiêu chuẩn ngủ đông

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

Tôi cố gắng để tái tạo các truy vấn sử dụng Tiêu chuẩn như thế này:

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(); 
     } 
    } 

Điều này không hiệu quả vì các hàng đáp ứng Tiêu chí này rất nhiều, kết quả duy nhất của tôi là vấn đề ở đây tôi đoán. Làm cách nào để chuyển đổi điều này thành cập nhật cho tất cả các hàng đáp ứng Tiêu chí. Tôi không muốn sử dụng truy vấn HQL, tôi thay vì làm điều đó với tiêu chí.

Trả lời

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(); 
     } 
    } 

Nó luôn luôn cho rằng thực hiện thao tác hàng loạt rất gần với cơ sở dữ liệu và chúng ta không cần giữ đối tượng được cập nhật trong phiên trừ khi họ được yêu cầu, Do đó cố gắng tránh đối tượng tải trong phiên trong khi thực hiện thao tác hàng loạt.

+0

Cảm ơn bạn đã làm việc. – ErrorNotFoundException

Các vấn đề liên quan