为什么这个休眠模板bulkUpdate不起作用 [英] Why this hibernate template bulkUpdate doesn't work
本文介绍了为什么这个休眠模板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);
任何人都知道为什么?
解决方案
- 可以在批量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屋!
查看全文