2011-03-30 3 views
2

업데이트 문에 설정된대로 jpql에 매개 변수를 전달하려고합니다. 여기 문은 다음과 같습니다JPA 전달 매개 변수를 Set으로 설정

Query query = entityManager.createQuery("UPDATE Patient patient SET " 
              +"patient.surname=:surname, " 
              +"patient.firstname=:firstname, " 
              +"patient.homeAddress=:homeAddress, " 
              +"patient.relatedPersons=:relatedPersons, " 
              +"patient.hospital=:hospital " 
              +"WHERE patient.id=:id"); 
    query.setParameter("surname", updatablePatient.getSurname()); 
    query.setParameter("firstname", updatablePatient.getFirstname()); 
    query.setParameter("homeAddress", updatablePatient.getHomeAddress()); 
    query.setParameter("relatedPersons", updatablePatient.getRelatedPersons()); 
    query.setParameter("hospital", updatablePatient.getHospital()); 
    query.setParameter("id", id); 

그러나 나는 다음과 같은 오류 얻을 : 어떤 도움이 정말 감사하겠습니다

org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [****] was not matching type [java.util.Set]; nested exception is java.lang.IllegalArgumentException: Parameter value [****] was not matching type [java.util.Set] 

합니다.

덕분에 사전에 JPQL에

답변

2

업데이트 문은 거의 사용되지 않으며, 배치 업데이트에 사용되어야하지만 단순히 하나의 엔티티를 업데이트 할 수 있습니다. 그것들은 SQL로 직접 변환되기 때문에 SQL에서 환자와 그의 모든 관련자를 업데이트 할 수는 없습니다. JPQL도 마찬가지입니다. 당신이 원하는 것을 할

, 그냥 데이터베이스에서 환자를 얻고,로드 된 환자에 새 속성을 설정합니다

Patient p = (Patient) entityManager.find(Patient.class, id); 
p.setSurname(updatablePatient.getSurname()); 
p.setRelatedPersons(updatablePatient.getRelatedPersons()); 
// ... set other properties 

또는 갱신 가능한 환자는 환자의 분리 된 사본 인 경우

Patient p = (Patient) entityManager.merge(updatablePatient); 

JPA (또는 지점들 중 적어도 하나)의 요점 사용 생성하는 질의 및 업데이트보다는 객체 그래프를 사용하고 수정할 수 있도록하고, 업데이트하고, 이에 따라, 동일 ID를 가진다 데이터베이스의 데이터.

+0

감사 nizet, 난 그냥 질문으로 어떻게 알고 싶어, 병합 방법에 대해 알고, 당신의 노력에 대한 감사, 하지만 내가하고 싶은 방식대로하는 법을 알고 싶습니다. 어쨌든 고마워. – Ikthiander

0

JPQL을 통해 집합 (또는 일반적으로 컬렉션 값 필드)을 업데이트 할 수 없습니다.

자세한 내용은
update_clause ::= UPDATE entity_name [[AS] identification_variable] 
SET update_item {, update_item}* 
update_item ::= [identification_variable.] 
       {state_field | single_valued_object_field} = new_value 

: 다음과 같이 JPA 2.0 스펙에서는 이것을 철자가 JPQL BNF