2016-11-02 3 views
0

Как QuerySyntaxException пытается запустить этот запрос:Spring/Hibernate: JPA исключение :: Путь ожидается РЕГИСТРИРУЙТЕСЬ

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 вы не можете писать JOIN, как в SQL. Вы должны уточнить путь джойна отношения


Либо вы делаете родной запрос SQL:

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

Либо адаптировать SQL запрос в JPQL запросе.
Для этого вам нужно изменить несколько вещей.

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 имеет свое рефлексивное отношение, основанное на этом условии.

Смежные вопросы