2016-11-02 57 views
0

獲取QuerySyntaxException試圖運行此查詢JPA異常:路徑:春/休眠:預計JOIN

public interface SignalRepository extends PagingAndSortingRepository<Signal, Long> { 

... 
@Query("select p1 from Signal p1 LEFT JOIN Signal p2 " 
     + " ON (p1.zoneId = p2.zoneId AND p1.createdAt < p2.createdAt) " 
     + " where p2.id is null AND p1.userId=?#{[0]} AND p1.pid=?#{[1]}") 

產生以下錯誤:

caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [select p1 from com.newco.models.Signal p1 LEFT JOIN Signal p2 ON (p1.zoneId = p2.zoneId AND p1.createdAt < p2.createdAt) where p2.id is null AND p1.userId=?1 AND p1.pid=?2] 
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final] 
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final] 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:268) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final] 

此查詢工作以及輸入SQL命令行時(和Ruby on Rails),但Spring/JAP失敗。

+0

JPQL!= SQL ... –

回答

1

Path expected for join!

對於JPQL,您不能像在SQL中那樣編寫JOIN。你必須精確的連接關係


要麼你做一個本地的SQL查詢的路徑:

Query q = em.createNativeQuery("YourQuery", Signal.class); 

要麼你適應在JPQL查詢您的SQL查詢。
要做到這一點,你應該改變幾件事情。

1)我不確定JPA認識到這個語法:p1.userId=?#{[0]} AND p1.pid=?#{[1]}來設置參數值。你應該使用:p1.userId=:?1 and p1.pid=:?2

2)承認你Signal實體,自反關係(P2),該LEFT JOIN條件應該是類似的東西(JOIN由對實體關係和ON成爲WITH)聲明:

"select p1 FROM Signal p1 LEFT JOIN p1.p2 p2 " 
     + " WITH p1.createdAt < p2.createdAt " 
     + " where p2.id is null AND p1.userId=:?1 AND p1.pid=:?2 

3) p1.zoneId = p2.zoneId條件不應該在WITH需要,如果Signal實體有基於這種條件的自反關係。