Как я могу выполнить обновление (именованный запрос) в Hibernate Template? - PullRequest
2 голосов
/ 20 марта 2011

У меня есть именованный запрос, подобный этому:

@NamedQueries ({ ...

@NamedQuery(name = "myUpdate", query = "update User set country = 'EN' where user.id = :id")

... })

В слое Дао

getHibernateTemplate().bulkUpdate(...?)

UPDATE

Query query = sessionFactory.getCurrentSession.getNamedQuery("myUpdate");
getHibernateTemplate.bulkUpdate(query.getQueryString(), id);

Я получаю сообщение об ошибке:

Hibernate: обновить пользователя, указать страну = EN, где id = 2343 ORA-00971: отсутствует ключевое слово SET

Кто-нибудь сейчас может решить эту проблему?

ОБНОВЛЕНИЕ 2

@NamedQuery(name = "myUpdate", query =
 "update User set country = 'EN' where
 user.profile.id = ?")

OK

  @NamedQuery(name = "myUpdate", query =
     "update User set country = 'EN' where
     user.profile.name = ?")

НЕ ОК: (

Ответы [ 2 ]

4 голосов
/ 20 марта 2011

К сожалению, эта функция отсутствует весной, поскольку именованные запросы должны использоваться только для извлечения данных. Одна вещь, которую вы можете сделать, это (это немного обойти)

Session session = getHibernateTemplate().getSession();
Query query = session.getNamedQuery("myUpdate");
String update = query.getQueryString();
getHibernateTemplate().bulkUpdate(update, [params]);

Я бы сказал, что это какой-то помощник, так что ваша логика DAO тоже не должна обойти весну.

редактировать

между пользователем и запятой "update User , set country = EN где"

есть запятая.
0 голосов
/ 04 июля 2018

На самом деле это очень старый вопрос, но у меня была такая же проблема сегодня. Я понял, что обновление не работает, так как вы не можете иметь соединение внутри простого ОБНОВЛЕНИЯ. Это также причина, почему запятая добавляется. Hibernate пытается переписать запрос следующим образом:

UPDATE User u, Profile p SET u.country = 'EN' where p.name = ? AND p.id = u.profile.id

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

@NamedQuery(name = "myUpdate", query = ""
  + " UPDATE User u "
  + " SET country = 'EN' "
  + " WHERE u.profile.id IN ( "
  + "   SELECT p.id "
  + "   FROM Profile p "
  + "   WHERE p.name = ? "
  + " )"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...