我想在更新语句中设置的jpql中传递一个参数。这是声明:
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]
任何帮助都会非常感激。
提前致谢
答案 0 :(得分:2)
JPQL中的更新语句很少使用,应该用于批量更新,而不仅仅是更新一个实体。它们直接转换为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(或至少其中一点)的重点是能够使用和修改对象图,而不是使用查询来创建和更新数据库中的数据。
答案 1 :(得分:0)
不支持通过JPQL更新集合(或通常任何集合值字段)。在JPA 2.0规范中,拼写如下:
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
有关详情:JPQL BNF