hibernate的size函数生成在oracle 11g中失败的sql

时间:2011-03-14 20:19:19

标签: oracle hibernate hql oracle11g

当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的错误吗?

2 个答案:

答案 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...)

工作得很好。唷 -