Я пытаюсь выполнить JPA с именем query на моей сущности, но он показывает синтаксическую ошибку. Может ли кто-нибудь сказать мне, в чем проблема с моим именованным запросом?
@Repository
public interface CollegeRepository extends CrudRepository<CollegeEntity, Integer> {
@Query("SELECT c FROM(SELECT *,(((acos(sin((:latitude * pi()/180)) * sin((latitude*pi()/180))+cos((:latitude * pi()/180)) * cos((latitude*pi()/180)) * cos(((:longitude - longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM college) t WHERE distance <= 30")
List<CollegeEntity> getCollegeByLocation(@Param("latitude") Double latitude, @Param("longitude") Double longitude, @Param("distance") Integer distance);
}
Это ошибка после выполнения запроса выше.
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 14 [SELECT c FROM(SELECT *,(((acos(sin((:latitude * pi()/180)) * sin((latitude*pi()/180))+cos((:latitude * pi()/180)) * cos((latitude*pi()/180)) * cos(((:longitude - longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM college) t WHERE distance <= :distance]
Когда я выполняю ниже собственный запрос в терминале MySQL, тогда работаю хорошо.
mysql> SELECT * FROM(SELECT *,(((acos(sin((0.0 * pi()/180)) * sin((latitude*pi()/180))+cos((0.0 * pi()/180)) * cos((latitude*pi()/180)) * cos(((0.0 - longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM college) t WHERE distance <= 30;
Empty set (0.08 sec)
Кажется, что ваш запрос не является правильным синтаксисом JPQL, потому что в JPA нет функций acos
, pi
, sin
, cod
, ваш запрос выглядит как родной запрос, чтобы решить вашу проблему, у вас есть два варианта:
nativeQuery = true
@Query(nativeQuery = true, value="SELECT * FROM(...")
, обратите внимание, что *
в вашем запросе нет псевдонима c
.Ты можешь использовать:
@Query(value = "SELECT * FROM(SELECT *,"
+ "(((acos(sin((0.0 * pi()/180)) * sin((latitude*pi()/180)) + "
+ "cos((0.0 * pi()/180)) * cos((latitude*pi()/180)) * "
+ "cos(((0.0 - longitude)*pi()/180))))*180/pi()) * "
+ "60*1.1515*1.609344) as distance FROM college) t WHERE distance <= 30;",
nativeQuery = true)
В вашем случае я настоятельно рекомендую второй вариант.