2013-08-30 2 views
1

최대 절전 모드에서 Criteria를 작성하려고합니다. empfield1 열의 값이 'REGULARIZE'가 아니고 update else가 레코드를 갱신하지 않으면 원하는 결과가 나타납니다.Hibernate saveorupdate()를 사용하여 somcolumn! = "somevalue"레코드를 갱신하십시오.

나는 아래에서 시도했다.

Session session = factory1.openSession(); 
    Criteria criteria=session.createCriteria(EmployeePunch.class); 
      criteria.add(Restrictions.ne("empField1","REGULARIZE")); 
EmployeePunch empPunch = (EmployeePunch)criteria.uniqueResult(); 
      empPunch.setId(empPuncId); 
      empPunch.setSigninTime(inTime); 
      empPunch.setSigninDate(dateOfUpdate); 
      empPunch.setSignoutTime(outTime); 
      empPunch.setPresent(presentStatus); 
      empPunch.setLastUpdateBy(empcode); 
      empPunch.setLastUpdateDate(time); 
      empPunch.setEmpField1(remark); 
      session.saveOrUpdate(empPunch); 
      tx.commit(); 

하지만 나에게 그 criteria 여러 기록이 Database에있다가 함께 의미 오류

Exception : query did not return a unique result: 527 
+0

분명히 예외입니다. 그것의 어느 부분을 이해하지 못합니까? – greyfairer

+0

왜 setId (empPuncId)를 사용합니까? 기존 레코드의 기본 키입니까? 아니면 empPuncId는 어디에서 왔습니까? – greyfairer

+0

실제로 나는 동면하는 초보자입니다. 처음에는 예외의 의미를 이해하지 못했지만 이제는 이해합니다. – Abhijit

답변

1

나는 당신이 ID를 제공해야합니다뿐만 아니라 다음과 같은 empField1="REGULARIZE"

여러 레코드를 반환합니다 아이디 최대 절전 모드를 제공하지 않고 ID를 제공하는 것을 잊지 생각 그것을 업데이트하십시오.

+0

문제가 생겼지 만 레코드를 업데이트 할 수 없었습니다. 결국 목록에 결과를 가져 와서 목록 크기가 비어 있지 않으면 saveOrUpdate가 아무 것도하지 않으면 목록 크기를 비교합니다. – Abhijit

+0

예. 지정한 ID가있는 레코드가없는 경우 동일한 작업을 수행해야합니다. – commit

1

을 제공합니다.

그래서 그 emps 당신에게 기준을 충족 EmployeePunch's의 목록을 제공합니다

List<EmployeePunch> emps = (ArrayList<EmployeePunch>)criteria.list(); 

을보십시오, 얼마나 많은 기록을 알고.

그런 다음 목록을 반복하여 데이터베이스에 몇 개의 항목이 있는지 확인하십시오.

+0

예, 더 많은 레코드를 반환했습니다. – Abhijit

+0

예. 나는 이드를 critera로 언급하는 것을 놓쳤다. 나는 목록에 결과를 가져 왔고 목록이 비어 있지 않으면 목록 크기를 완성하고 그렇지 않으면 아무것도하지 않았다. – Abhijit

+0

@ user1363086 이제 문제가 해결되었습니다. 이제 할 수있는 것은 있습니다. 결과를 얻고 'resultlist.get (0)'과 같은 첫 번째 요소를 가져 와서 업데이트하십시오. 그러면 목록의 첫 번째 요소가 표시됩니다. 유일성에 관계없이 리턴 된'list'에 널 체크를 추가하는 것을 잊지 마십시오. –

0

왜 이런 방식으로 HQL을 사용하지 않습니까?

Query query = session.createQuery("update EmployeePunch set signinTime = :signinTime, signinDate = :signinDate where empField1 = 'REGULARIZE').setParameter("signinTime",signinTime).setParameter("signinDate",signinDate); 
int updateRecordCount = query.executeUpdate(); 

당연히 다른 입력란의 값 (@Id 입력란 인 경우 Id 제외)을 설정해야합니다. updateRecordCount에 업데이트 된 레코드 수가 표시됩니다. 이제

Criteria criteria=session.createCriteria(EmployeePunch.class); 
     criteria.add(Restrictions.ne("empField1","REGULARIZE")) 
     .add(Restrictions.eq("empPuncId",empPuncId)); 

그 다음 하나의 일치하는 레코드를 반환 할 것이다 :

관련 문제