JPQL для получения ближайших записей по широте и долготе

StackOverflow https://stackoverflow.com/questions/2064977

  •  20-09-2019
  •  | 
  •  

Вопрос

У меня есть объекты с широтой и долготой, и я хотел бы выбрать те, которые ближе всего к заданной точке.

Я нашел этот пример, который выглядит так, как будто это сработает

SELECT *,
    SQRT(POW((69.1 * (locations.latitude - 27.950898)) , 2 ) +
    POW((53 * (locations.longitude - -82.461517)), 2)) AS distance
FROM locations
ORDER BY distance ASC
LIMIT 5

Но я бы предпочел сделать это с помощью JPQL, так как у меня есть куча других объединений и т.д., Которые проще выполнять в JPQL вместо собственного запроса.

Когда я пробую что-то подобное, JPA жалуется на токен SQRT.

SELECT DISTINCT p, SQRT(....) AS distance, FROM Place p .... ORDER BY distance ASC

Кто-нибудь знает, как написать подобный запрос, или, может быть, другой лучший подход?

Спасибо!/Oskar

Это было полезно?

Решение

Насколько я могу судить по результатам исследования этого и, возможно, проб и ошибок, JPQL просто не приспособлен для обработки этого сценария.Мне пришлось переписать свои запросы как родные.

Другие советы

Справочник по языку JPQL говорит , что:

functions_returning_numerics ::= ABS(simple_arithmetic_expression) | SQRT(simple_arithmetic_expression) | MOD(simple_arithmetic_expression, simple_arithmetic_expression) | SIZE(collection_valued_path_expression)

Итак, у вас нет POW.

Вы можете безопасно использовать собственный запрос.

Однако подход, который я бы предпочел, заключается в том, чтобы выполнить запрос без вычислений, а затем выполнить вычисление по результату в вашем коде.Это не должно сильно сказываться на производительности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top