2016-11-02 58 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实体有基于这种条件的自反关系。