【问题标题】:JPA passing parameter as SetJPA 将参数作为 Set 传递
【发布时间】:2011-07-26 08:41:16
【问题描述】:

我想在 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]

任何帮助将不胜感激。

提前致谢

【问题讨论】:

    标签: mysql persistence jpa-2.0 jpql


    【解决方案1】:

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

    【讨论】:

    • 谢谢 nizet,我知道合并方法,我只是想知道如何做这个问题,感谢您的努力,但我想知道如何按照我想做的方式去做。无论如何,谢谢。
    【解决方案2】:

    不支持通过 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2019-03-26
      • 2020-09-18
      • 2015-05-24
      • 2012-11-10
      • 2020-10-30
      相关资源
      最近更新 更多