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(或其点中的至少一个)的全部要点是能够使用和修改一个对象图,而不是使用查询来创建和更新数据库中的数据。
答
通过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
感谢nizet,我知道有关合并的方法,我只是想知道如何为这个问题做的,感谢你的努力,但我想知道如何以我想要的方式来做到这一点。不管怎么说,还是要谢谢你。 – Ikthiander 2011-03-31 14:34:11