найти все адреса на расстоянии - PullRequest
0 голосов
/ 18 мая 2018

Мне нужно получить список адрес + расстояние на основе указанного широты / долготы.

Мой запрос:

@Query("Select new com.geolocation.AddressVM(A, "
    + "("
    + " 6371 * "
    + " acos( "
    + "     cos(radians(:lat)) * "
    + "     cos(radians(A.geoLocation.latitude)) *"
    + "     cos("
    + "         radians(A.geoLocation.longtitude) - radians(:lng)"
    + "     ) + "
    + "     sin(radians(:lat)) *"
    + "     sin(radians(A.geoLocation.latitude))" 
    + " ) "
    + ") as distance)  from #{#entityName} A "
    + "having distance > :distance")
List<AddressVM> list(@Param("lat") double lat, @Param("lng") double lng, @Param("distance") double distance);

Однако, когда я запускаю запрос, он выдает мне сообщение об ошибке из-за неожиданного появления токена.Я думаю, что «как расстояние» не видно за скобками.Пожалуйста, помогите исправить мне построить этот запрос.

1 Ответ

0 голосов
/ 18 мая 2018

Только MySQL и несколько других баз данных позволяют использовать предложение HAVING без GROUP BY.Я предполагаю, что это здесь не разрешено, поэтому вы получаете ошибку.Один из обходных путей - просто повторить выражение расстояния в правильном предложении WHERE, где эта проверка должна быть:

Select new com.geolocation.AddressVM(A,
6371 * acos( cos(radians(:lat)) * cos(radians(A.geoLocation.latitude)) *
    cos( radians(A.geoLocation.longtitude) - radians(:lng) ) +
    sin(radians(:lat)) * sin(radians(A.geoLocation.latitude)) )
) as distance
from #{#entityName} A
where
    6371 * acos( cos(radians(:lat)) * cos(radians(A.geoLocation.latitude)) *
    cos( radians(A.geoLocation.longtitude) - radians(:lng) ) +
    sin(radians(:lat)) * sin(radians(A.geoLocation.latitude)) )
) > :distance

Другой обходной путь - подзапросить текущий запрос, а затем повторно использовать distance псевдоним.Я не буду писать это полностью, но это будет выглядеть примерно так:

SELECT *
FROM
(
    -- your current query
) t
WHERE t.distance > :distance

В этом случае мы можем использовать псевдоним distance в предложении WHERE, потому что он былматериализован как фактический столбец в подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...