如何在Hibernate模板中执行更新(命名查询)?

时间:2011-03-20 08:04:32

标签: java hibernate

我有一个这样的命名查询:

@NamedQueries ({ ...

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

... })

在dao图层

getHibernateTemplate().bulkUpdate(...?)

更新

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

我收到错误:

Hibernate:更新用户,设置country = EN,其中id = 2343 ORA-00971:缺少SET关键字

现在有人怎么解决这个问题?

更新2

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

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

不行:(

2 个答案:

答案 0 :(得分:4)

不幸的是,春天缺少该功能,因为命名查询应该仅用于检索数据。你可以做的一件事是(这是一个解决方法)

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

我会把它放在某种帮手中,所以你的DAO逻辑也不必绕过春天。

修改

用户之间有一个悬空的逗号,并设置“更新用户设置country = EN where”

答案 1 :(得分:0)

实际上这是一个非常老的问题,但是我今天遇到了同样的问题。我意识到,由于您无法在简单的UPDATE中加入联接,因此更新无法正常进行。这也是添加逗号的原因。 Hibernate尝试像这样重写查询:

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

要解决此问题,您需要自己从第二个表中选择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 = ? "
  + " )"