当hibernate解析出这个hql:
UPDATE VERSIONED Person SET groupsCount = followingGroup.size WHERE id = :id
它会生成这个sql:
UPDATE Person
SET version =version+1,
groupsCount=
(SELECT COUNT(followingg1_.followerId)
FROM GroupFollower followingg1_
WHERE Person.id=followingg1_.followerId
)-1
WHERE id IN
(SELECT groupfollo2_.followerId
FROM GroupFollower groupfollo2_
WHERE groupfollo2_.followingId=?
)
该查询在子查询之后的“-1”处失败,以便计算以下数。如果我取出“-1”它运行得很好,或者如果我将“-1”移动到“SELECT COUNT(followingg1_.followerId) - 1”它也有效。
我没有看到如何解决这个问题,缺少使用db特定的sql,这是11g的错误吗?
答案 0 :(得分:1)
以下是关于apex.oracle.com背后的11.2.0.2实例
create table person (id number, version number, groupscount number);
create table groupfollower (followerid number, followingid number);
insert into person values (1,1,0);
insert into person values (2,1,0);
insert into groupfollower values (1,2);
UPDATE Person
SET version =version+1,
groupsCount=
(SELECT COUNT(followingg1_.followerId)
FROM GroupFollower followingg1_
WHERE Person.id=followingg1_.followerId
)-1
WHERE id IN
(SELECT groupfollo2_.followerId
FROM GroupFollower groupfollo2_
WHERE groupfollo2_.followingId=2
)
建议您在您的版本中检查SQL。这可能是一个Hibernate问题。
答案 1 :(得分:1)
好吧,我发现了问题,我错了,那个语句处理的是一个“Person”对象,这是我第一次意识到的更复杂,虽然它在那条线上测试失败了,它实际上是hql in它正在测试的类产生了问题的sql。
UPDATE VERSIONED Person SET groupsCount = followingGroup.size - 1 WHERE id IN (SELECT etc...)
所以回答第一部分,答案的第二部分是它的一个已知的bug显然在oracle 10g中你不能在更新语句中的子查询之后进行算术运算(duh!)所以改变上面的
UPDATE VERSIONED Person SET groupsCount = - 1 + followingGroup.size WHERE id IN (SELECT etc...)
工作得很好。唷 -