gpt4 book ai didi

mysql - JPA 将参数作为 Set 传递

转载 作者:行者123 更新时间:2023-11-29 02:35:38 27 4
gpt4 key购买 nike

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

任何帮助将不胜感激。

提前致谢

最佳答案

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

关于mysql - JPA 将参数作为 Set 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5491229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com