2011-03-14 81 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