我有一个这样的命名查询:
@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 = ?")
不行:(
答案 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 = ? "
+ " )"