JPA传递参数为Set

时间:2011-03-30 19:26:10

标签: mysql persistence jpa-2.0 jpql

我想在更新语句中设置的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]

任何帮助都会非常感激。

提前致谢

2 个答案:

答案 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