2016-12-02 73 views
1

在MySQL中它的工作原理:QuerySyntaxException:意外的標記:

SELECT * FROM carparks a 
LEFT JOIN (SELECT * FROM locales_carparks) 
c ON a.carpark_id=c.carpark_id 

熱水將其翻譯爲JPA:

@Query("SELECT a FROM Carparks a LEFT JOIN(" 
      +"SELECT b FROM a.locales b" 
      +")") 

拋出:IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException :意外的標記: (靠近第1行,第72列[SELECT a FROM database.model.carpark.Carparks a LEFT JOIN(SELECT b FROM a.locales b)]

我已經簡化了示例以顯示問題的實質。通常我只使用SELECT a FROM Carparks a LEFT JOIN a.locales和它的作品,但在我的情況下,我想使用嵌套的SELECT,因爲我的查詢要複雜得多

+0

嘿,你的實體映射到一對多的關係嗎? – user1211

+0

寫一個簡單的方法是@Query(「選擇*從A左邊加入B b在a.id = b.id」) – user1211

+0

所以當然我使用關係,我想簡化它,這是原因我沒有收錄它。是的,我嘗試加入a.id = b.id,但與JPA這不起作用,因爲JPA自動識別關係。 和關鍵字「on」必須省略 – user3871754

回答

2

你可以使用一個簡單的替代

create view v_carparks as 
    SELECT * FROM carparks a 
    LEFT JOIN (SELECT * FROM locales_carparks) 
    c ON a.carpark_id=c.carpark_id 

,並將其用於查詢

@Query("SELECT a FROM v_carparks") 

尤其是當曲這是一個複雜的問題,爲了隱藏這種複雜性,這樣做會更清晰。

編輯:

不能用於加入嵌套查詢。這是寫在HQL documentation這樣的:

注意,HQL自查詢只能出現在select或者where子句。

這可以解釋爲映射系統。很難用子查詢結果進行映射。

+0

你是對的你的解決方案更好,但有可能以某種方式使它按我的方式工作? – user3871754

+1

@ user3871754 Infortunatly,nope。這是在HQL文檔中。讓我更新我的答案 – AxelH

+0

我測試了它,並得到:視圖的SELECT包含FROM子句中的子查詢 – user3871754

0

你可以寫這樣的

@Query("SELECT a FROM Carparks a LEFT JOIN Locales b on a.carpark_id = b.carpark_id") 
+0

謝謝,我通常使用SELECT a FROM Carparks左加入a.locales,它的工作原理,但在我的情況下,我想使用嵌套的SELECT,因爲我的查詢更復雜,我要更新問題來澄清它 – user3871754