JPA传递参数设置为

问题描述:

我想在更新语句中设置的jpql中传递参数。这里是语句:JPA传递参数设置为

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

Update语句很少被使用,并且应当用于批量更新,而不是简单地更新一个实体。它们直接转换为SQL,并且无法在SQL中更新患者和所有相关人员。 JPQL也是如此。

做你想要做什么,只是从数据库中获取病人,并设置新的属性到装入患者:

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

或者,如果更新病人是病人的一种超然的副本更新,并且因此具有相同的ID,

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

JPA(或其点中的至少一个)的全部要点是能够使用和修改一个对象图,而不是使用查询来创建和更新数据库中的数据。

+0

感谢nizet,我知道有关合并的方法,我只是想知道如何为这个问题做的,感谢你的努力,但我想知道如何以我想要的方式来做到这一点。不管怎么说,还是要谢谢你。 – Ikthiander 2011-03-31 14:34:11

通过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