为什么这个休眠模板bulkUpdate不起作用 [英] Why this hibernate template bulkUpdate doesn't work

查看:101
本文介绍了为什么这个休眠模板bulkUpdate不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Oracle 10g,Hibernate 3.4

此更新(基于 long user.userId 值)正确完成:

  getHibernateTemplate()。bulkUpdate(update address address set address.preferred = 1 where address.user.userId =? ,1l); 

这一个(基于 String user.language value)抛出一个异常 ORA-00971:缺少SET关键字

  getHibernateTemplate()。bulkUpdate(update address address set address.preferred = 1 where address.user.language =?,en); 

任何人都知道为什么?

解决方案

Hibernate文档 a>表示:



  • 可以在批量HQL查询中指定隐式或显式联接。子查询可以用在where子句中,其中子查询本身可以包含连接。


所以,你需要用等价的子查询替换隐式连接:

  getHibernateTemplate()。bulkUpdate(
update address address set address.preferred = 1+
where address.user in (从u中选择你在哪里u.language =?),
en);


Oracle 10g, Hibernate 3.4

This update (based on long user.userId value) is done correctly:

getHibernateTemplate().bulkUpdate("update Address address set address.preferred = 1 where address.user.userId = ?", 1l);

This one (based on String user.language value) throws an exception ORA-00971: missing SET keyword:

getHibernateTemplate().bulkUpdate("update Address address set address.preferred = 1 where address.user.language = ?", "en");

Anybody knows why?

解决方案

Hibernate documentation says:

  • No joins, either implicit or explicit, can be specified in a bulk HQL query. Sub-queries can be used in the where-clause, where the subqueries themselves may contain joins.

So, you need to replace implicit join with the equivalent subquery:

getHibernateTemplate().bulkUpdate(
   "update Address address set address.preferred = 1 " +
   "where address.user in (select u from User u where u.language = ?)",
   "en"); 

这篇关于为什么这个休眠模板bulkUpdate不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆