2012-05-04 70 views
71

我不斷嘗試此查詢的變體,並且似乎無法做到這一點。我也引用了這篇文章:Path Expected for Join! Nhibernate Error,似乎無法將相同的邏輯應用於我的查詢。我的User對象有一個UserGroup集合。HQL錯誤:預計加入的路徑

據我所知,查詢需要的對象中引用的實體,但是從我所看到的我是...

@NamedQuery(
    name = "User.findByGroupId", 
    query = 
    "SELECT u FROM UserGroup ug " + 
    "INNER JOIN User u WHERE ug.group_id = :groupId ORDER BY u.lastname" 
) 

回答

102
select u from UserGroup ug inner join ug.user u 
where ug.group_id = :groupId 
order by u.lastname 

爲命名查詢:在HQL語句

@NamedQuery(
    name = "User.findByGroupId", 
    query = 
    "SELECT u FROM UserGroup ug " + 
    "INNER JOIN ug.user u WHERE ug.group_id = :groupId ORDER BY u.lastname" 
) 

使用的路徑,從一個實體到另一個。詳情請參閱Hibernate documentation on HQL and joins

+22

什麼是「路徑」?我搜索了HQL文檔,但沒有找到定義。 – gwg

+2

這意味着你需要鏈接實體:在他上面的例子中,請注意他是如何放置ug.user u的。沒有ug之前,你會得到錯誤。另外,'ug.user u'中的'user'應該是Class UserGroup中字段的名稱! – Lawrence

+1

這個HQL語法令人討厭。我不得不找到很多例子並找到你的。 –

38

您需要命名保存的關聯用戶的實體。例如,

... INNER JOIN ug.user u ... 

這就是錯誤消息所抱怨的「路徑」 - 從UserGroup到User實體的路徑。

Hibernate依賴於聲明性JOIN,爲此,映射元數據中聲明瞭連接條件。這就是爲什麼在沒有路徑的情況下構建本地SQL查詢是不可能的。

+9

終於有人回答問題的根源...(需要用現有的別名前綴外部表) 解決了我的問題,非常感謝! –