我正在尝试运行一个更新查询,它将在sql中看起来像这样:
update studentMaster set sess_status = 'G' where ACADEM_YEAR = COURSE_YEAR;
我正在尝试使用 Criteria 这样重新创建查询:
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(); } }
这行不通,因为满足该条件的行很多,我的独特结果是我猜这里的问题。如何将其转换为符合条件的所有行的更新。我不想使用HQL查询,而是使用Criteria来执行。
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(); } }
始终建议执行批量操作非常接近数据库,除非需要,否则我们不需要在会话中保留更新的对象,因此,在执行批量操作时,请避免在会话中加载对象。