2011-03-02 66 views
2

我遇到了一個奇怪的錯誤,試圖在MySQL中使用Hibernate。我有以下命名查詢:休眠MySQL查詢錯誤加入的未知列在

SELECT SUM(s.plotline.value), s.character FROM Story as s WHERE s.chapter.chapterID = ?1 GROUP BY s.character ORDER BY SUM(s.plotline.value) 

這被轉換爲下面的SQL語句:

select sum(plotline1_.Value) as col_0_0_, story0_.CharacterID as col_1_0_, character2_.CharacterID as Characte1_5_, 
character2_.AuthorID as AuthorID5_, character2_.BookID as BookID5_, character2_.CharacterName as Characte2_5_, 
character2_.LastModified as LastModi3_5_ 
from fantasy.story story0_, fantasy.plotline plotline1_ 
inner join fantasy.character character2_ on story0_.CharacterID=character2_.CharacterID 
where story0_.PlotlineID=plotline1_.PlotlineID and story0_.ChapterID= 4 
group by story0_.CharacterID 
order by count(plotline1_.Value) 

當我執行此我得到:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'story0_.CharacterID' in 'on clause' 
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    java.lang.reflect.Constructor.newInstance(Unknown Source) 
    com.mysql.jdbc.Util.handleNewInstance(Util.java:407) 
    com.mysql.jdbc.Util.getInstance(Util.java:382) 

如果我更改查詢到這並直接在SQL中運行它運行正常:

select sum(plotline1_.Value) as col_0_0_, story0.CharacterID as col_1_0_, character2_.CharacterID as Characte1_5_, 
character2_.AuthorID as AuthorID5_, character2_.BookID as BookID5_, character2_.CharacterName as Characte2_5_, 
character2_.LastModified as LastModi3_5_ 
from fantasy.story story0, fantasy.plotline plotline1_ 
inner join fantasy.character character2_ on CharacterID = character2_.CharacterID 
where story0.PlotlineID=plotline1_.PlotlineID and story0.ChapterID= 4 
group by story0.CharacterID 
order by count(plotline1_.Value) 

有兩個部分對這一問題

  1. 爲什麼去掉明確資格中或CharacterId的連接,使這項工作?我的經驗主要是使用SQL Server,如果您嘗試以這種方式編寫查詢,它實際上會失敗。
  2. 有沒有辦法讓Hibernate以適當的形式給我提供查詢或調整我的MySQL配置,以便它接受Hibernate產生它的方式的查詢?
+0

我可能已經找到了第1部分的解釋http://krisgale.com/beware-of-table-alias-in-left-join/似乎MySQL決定要求括號多個表,如果他們在選擇從版本5開始。這不幫助我修復我的hibernate查詢,這裏的幫助仍然非常感謝 – 2011-03-02 02:22:52

回答

0
  1. 「字符」是MySQL中的保留字。這可能是拋出查詢的原因嗎?

  2. 您可以強制Hibernate在生成的SQL中引用標識符,方法是在映射文檔中將反斜槓中的表或列名稱括起來。 Hibernate將爲SQL方言使用正確的引號樣式(通常使用雙引號,但括號表示SQL Server,反引號表示MySQL)。

1

你的第一個請求沒有因爲 「story0_」 的工作尚處於 「上條款」 當你寫

from fantasy.story story0_, fantasy.plotline plotline1_ inner join fantasy.character character2_ on story0_.CharacterID=character2_.CharacterID 

「從A,B內加入C」 未知,SQL(5.0版本及稍後)只考慮B和C之間的內部關節,然後只允許這兩個表之間的「on子句」。

2解決方案應該工作:

  • 添加括號

from (fantasy.story story0_, fantasy.plotline plotline1_) inner join fantasy.character character2_ on story0_.CharacterID=character2_.CharacterID

  • 變化表順序

from fantasy.plotline plotline1_, fantasy.story story0_ inner join fantasy.character character2_ on story0_.CharacterID=character2_.CharacterID

更多詳細信息,請訪問:https://bugs.mysql.com/bug.php?id=13551

我想,解你已經找到工作,因爲或CharacterId也是plotline1_場

我目前面臨這個問題與Hibernate,即使我發現爲什麼SQL語句引發了異常(以及如何糾正它),我不知道如何配置Hibernate來迫使它生成這兩種解決方案之一。

如果有人知道如何用Hibernate做到這一點,謝謝你的幫助!