我想对项目中的某些层次结构使用UPDATE VERSIONED
HQL查询。原因是我想在一个查询中更新很多行,但我也希望乐观锁定机制能够工作。
我准备了一个小例子,可以很容易地重现问题。我正在使用Grails 2.5.5。
我的域名类:
abstract class Parent {
String name
static mapping = {
tablePerHierarchy false
}
}
class Child extends Parent {}
我的测试:
final def entity = new Child(name: 'Test').save()
final def version = entity.version
Parent.executeUpdate(
'UPDATE VERSIONED Parent p SET p.name = :val WHERE p.id IN (:ids)',
[ids: [entity.id], val: 'Updated value']
)
assertEquals(version + 1, entity.refresh().version)
H2数据库的例外:
Hibernate operation: could not prepare statement; bad SQL grammar [update parent set parent0_.version=parent0_.version+1, name=? where (id) IN (select id from HT_parent)]; nested exception is org.h2.jdbc.JdbcSQLException: Table "PARENT0_" not found; SQL statement:
update parent set parent0_.version=parent0_.version+1, name=? where (id) IN (select id from HT_parent) [42102-176]
对于Postgres我有类似的异常,也清楚地说生成的SQL查询是错误的。
以下是您可以自行尝试代码的沙盒:https://github.com/aistomin/gorm-update-versioned-bug
我怀疑它不是Grails / GORM问题,但Hibernate本身不允许我这样做。
目前我切换到纯SQL并显式增加版本。这对我有用,但如果有人遇到同样的问题,我只是好奇。也许你可以告诉我比我发现更好的解决方法。或者也许我不应该首先想要这种行为? :)
毕竟,我想知道它为什么不起作用?它是否与更新HQL查询中禁止的隐式连接有关?
提前感谢您的帮助。