JPA передавая параметр как Set - PullRequest
2 голосов
/ 30 марта 2011

Я хочу передать параметр в 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 ]

2 голосов
/ 31 марта 2011

Операторы обновления в JPQL используются редко, и их следует использовать для пакетных обновлений, а не просто для обновления одной сущности.Они переводят непосредственно в SQL, и вы не можете обновить пациента и всех связанных с ним лиц, таких как это, в SQL.То же самое касается JPQL.

Чтобы сделать то, что вы хотите сделать, просто извлеките пациента из базы данных и установите новые свойства для загруженного пациента:

Patient p = (Patient) entityManager.find(Patient.class, id);
p.setSurname(updatablePatient.getSurname());
p.setRelatedPersons(updatablePatient.getRelatedPersons());
// ... set other properties

Или, еслиобновляемый пациент - это отдельная копия пациента для обновления, и поэтому он имеет тот же идентификатор,

Patient p = (Patient) entityManager.merge(updatablePatient);

Весь смысл JPA (или хотя бы одного из его пунктов) должен быть в состоянии использовать иизменять граф объектов вместо использования запросов для создания и обновления данных в базе данных.

0 голосов
/ 28 мая 2012

Нет поддержки для обновления набора (или вообще любого поля с ценностью коллекции) через 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...