使用hibernate更新和删除时不能使用关系联接操作

在使用hibernate进行更新时,经常会碰到以下的操作。如将name为xxx的a下的bList的code信息更新为code+'f'。在使用hibernate时,经常会写下以下的hibernate操作:

update b set b.code='f' + b.code where b.a.name='xxx'

然而,这句看似没有错误的hql语句,在hibernate进行运行时,却会产生一个奇怪的现象。在生成的hql中,会在表b后面出现一下奇怪的逗号,会报一个错误的sql解析错误的异常,并且在生成的hql中,所没有出现在链接时所使用的a。

原因在于hibernate在进行更新以及删除时候时,并不支持联接操作,包括含有隐式的联接也是不行的。在相应的hibernate jira界面,可以看到以问题的错误:https://hibernate.onjira.com/browse/HHH-2408。在官方的hibernate手册时,有一条很不起眼的描述。http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/batch.html#batch-direct。描述的描述如下:

15.4. DML-style operations
Some points to note: 
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. 

继续阅读“使用hibernate更新和删除时不能使用关系联接操作”