2017-05-27 57 views
0

我想使用以下參數顯示所有未被回答且未被回答的清單(響應清單在ResponsesCheckLists表中):idequipement和idMission。JPA,JPQL:意外的令牌:左第1行左邊

antlr.NoViableAltException: unexpected token: LEFT 
------ 
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: LEFT near line 1, column 148 [SELECT check,resp,eq FROM com.SSC.DAO.Entities.Equipements eq INNER JOIN CheckLists check WHERE eq.idEquipements = check.equipements.idEquipements LEFT JOIN ResponsesCheckLists resp ON check.idCheckLists=resp.CheckLts.idCheckLists AND resp.Respmission.idMission = :idmiss WHERE eq.idEquipements = :idEqp ] 
------ 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'responsesCheckListsRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.SSC.DAO.JPARepository.ResponsesCheckListsRepository.ListCheckListsNonRepondu(long,long)! 

EDIT1:

@Query("SELECT check,resp,eq FROM Equipements eq INNER JOIN CheckLists check WHERE eq.idEquipements = check.equipements.idEquipements LEFT JOIN ResponsesCheckLists resp ON check.idCheckLists=resp.CheckLts.idCheckLists AND resp.Respmission.idMission = :idmiss WHERE eq.idEquipements = :idEqp ") 
    public List<ResponsesCheckLists> ListCheckListsNonRepondu(@Param("idEqp") long idEqp, @Param("idmiss") long idmiss); 

運行此查詢,我顯示該錯誤消息之後

@Query("SELECT check,resp,eq FROM Equipements eq INNER JOIN CheckLists check ON eq.idEquipements = check.equipements.idEquipements" 
      + " INNER JOIN ResponsesCheckLists resp ON check.idCheckLists=resp.CheckLts.idCheckLists AND resp.Respmission.idMission = :idmiss AND eq.idEquipements = :idEqp ") 
    public List<ResponsesCheckLists> ListCheckListsNonRepondu(@Param("idEqp") long idEqp, @Param("idmiss") long idmiss); 

EDIT1的錯誤;

引起:java.lang.IllegalStateException:對於節點沒有任何數據類型: org.hibernate.hql.internal.ast.tree.IdentNode + - [IDENT] IdentNode: '檢查'{originalText =檢查}

antlr.SemanticException:加入的路徑!

造成的:java.lang.IllegalArgumentException異常:驗證失敗 查詢方法公共抽象的java.util.List com.SSC.DAO.JPARepository.ResponsesCheckListsRepository.ListCheckListsNonRepondu(很長很長)!

EDIT2:

@Query("SELECT check , resp , eq FROM Equipements eq INNER JOIN CheckLists check ON eq.idEquipements = check.equipements.idEquipements" 
      + " INNER JOIN ResponsesCheckLists resp ON check.idCheckLists=resp.CheckLts.idCheckLists AND resp.Respmission.idMission = :idmiss AND eq.idEquipements = :idEqp ") 
    public List<ResponsesCheckLists> ListCheckListsNonRepondu(@Param("idEqp") long idEqp, @Param("idmiss") long idmiss); 

錯誤EDIT2的:

所致:java.lang.IllegalStateException:對於節點沒有任何數據類型: org.hibernate.hql .internal.ast.tree.IdentNode + - [IDENT] IdentNode: 'check'{originalText = check} antlr.SemanticExcept離子:加入的路徑!

如何更正此查詢?

預先感謝您

+0

你想要做一個本地查詢或JPQL查詢嗎? –

+0

我想做JPQL – Michael1

+1

中的查詢在WHERE子句中不允許使用'LEFT JOIN'。 – ujulu

回答

1

你有一個春天的註釋有(@Query),指定一個JPQL查詢。你的JPQL查詢應該遵循語法highlighted in this link(和JPA規範)。可悲的是你沒有遵循。

SELECT {result} FROM {from} WHERE {where} ... 

任何「JOIN」必須進入FROM子句。您已經在FROM子句中放入了一個JOIN,但出於您只知道的原因,您決定在WHERE子句中放入另一個JOIN!實際上你有2個WHERE子句在那個廢話裏。

不可能告訴你你的查詢應該是什麼,因爲你不會發布你的實體,所以我們不會看到他們有什麼關係,甚至沒有你想要達到的目標。我們只能指出你的錯誤

+0

我試圖根據鏈接修改請求。但我有另一種類型的錯誤。我更新了這篇文章。 @Neil Stockton – Michael1

+0

正如鏈接所說,任何JOIN都必須沿着RELATION(因爲JPQL是一個僞面向對象的查詢語言)。正如我上面所說,你不發佈你有什麼實體/領域,所以只有你知道哪裏有一個關聯 –

+0

我有JPQL中的3個表連接的問題。我不知道如何確保加入他們@尼爾斯托克頓 – Michael1