2011-03-14 78 views
1

当Hibernate解析出这个的HQL:Hibernate的大小函数生成的SQL在Oracle 11g中失败

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

哇,我不明白如何将这个hql传递给这个sql。我错过了什么。 -1从哪里来。 – 2011-03-14 20:23:50

+0

是啊,它看起来像“followingGroup.size”获取fkeyed groupfollower表中的匹配记录,其中有一个followingGroup列。从那里,我假设也许这会返回什么hibernate认为它应该(1对0)错误的开始索引,然后减去1以获得正确的“大小”。 我真的不明白,就是为什么查询失败,我知道的Oracle SQL非常好,我不明白为什么它不能运行 – chrismarx 2011-03-14 21:07:55

回答

1

好的,我发现问题,我错了,该声明处理一个“人”对象,这是我第一次意识到更复杂,虽然它是在那条线,测试失败,它实际上是hql在课堂上正在进行测试,产生了问题的SQL。

UPDATE VERSIONED Person SET groupsCount = followingGroup.size - 1 WHERE id IN (SELECT etc...) 

这样回答第一部分,答案的第二部分是它的一个已知的显然是在Oracle 10g中的bug,你不能在UPDATE语句子查询后做算术运算(废话!),所以改变上述为

UPDATE VERSIONED Person SET groupsCount = - 1 + followingGroup.size WHERE id IN (SELECT etc...) 

工作得很好。 phew-

+0

这是关于该错误的oracle线程 - http://forums.oracle.com/forums/thread.jspa?threadID=2192872 – chrismarx 2011-03-17 16:13:07

1

以下是工作的11.2.0.2实例背后apex.oracle.com

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问题。

+0

我碰到这个确切的安装脚本和更新语句,错误的是相同的 - ORA-00933:SQL命令不能正确地结束 00933. 00000 - “SQL命令不能正确地结束” *原因: *动作: 行错误:16列:4 16号线是 “)-1” – chrismarx 2011-03-15 14:06:25

+0

one correction,i'm still at 10g,oops - Oracle Database 10g企业版版本10.2.0.4.0 - 64bi – chrismarx 2011-03-15 14:09:02

+0

w现在,这是相当混乱,如果你把减法1的子查询它运行得很好。看起来像一个oracle错误。无论如何,重写size()函数在hibernate中的工作方式?其他的最佳做法是使用hibernate来解决像这样的db错误? – chrismarx 2011-03-15 16:14:55