【问题标题】:How can I execute an update (named query) in Hibernate Template?如何在 Hibernate 模板中执行更新(命名查询)?
【发布时间】:2011-03-20 08:04:31
【问题描述】:

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

@NamedQueries ({ ...

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

... })

在道层

getHibernateTemplate().bulkUpdate(...?)

更新

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

我收到一个错误:

休眠:更新用户,设置国家=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 = ?")

不行:(

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    不幸的是,spring 中缺少该功能,因为命名查询应该仅用于检索数据。您可以做的一件事是(这是一个变通方法)

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

    我会把它放在某种帮助器中,这样你的 DAO 逻辑也不必在 spring 中运行。

    编辑

    User 和 set "update User , set country=EN where" 之间有一个悬空逗号

    【讨论】:

    • 有效。谢谢!但不幸的是,我还有另一个问题。见更新
    • 这太荒谬了。我那里没有逗号。查询与堆栈完全相同。 :(
    • 如果 hibernate 添加了这个,那就很奇怪了。你能得到query.getQueryString()的结果吗?如果正确,请尝试查询update User set country = 'EN' where id = :id
    【解决方案2】:

    实际上这是一个非常古老的问题,但我今天遇到了同样的问题。我意识到更新不起作用,因为您不能在简单的更新中加入。这也是加逗号的原因。 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 = ? "
      + " )"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多