JPQL для получения ближайших записей по широте и долготе
Вопрос
У меня есть объекты с широтой и долготой, и я хотел бы выбрать те, которые ближе всего к заданной точке.
Я нашел этот пример, который выглядит так, как будто это сработает
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
.
Вы можете безопасно использовать собственный запрос.
Однако подход, который я бы предпочел, заключается в том, чтобы выполнить запрос без вычислений, а затем выполнить вычисление по результату в вашем коде.Это не должно сильно сказываться на производительности.