2010-01-14 4 views
1

У меня есть объекты с широтой и долготой, и я хотел бы выбрать ближайших к данной точке.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

ответ

1

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

0

The JPQL language reference говорит, что:

functions_returning_numerics :: = ABS (simple_arithmetic_expression) | SQRT (simple_arithmetic_expression) | MOD (simple_arithmetic_expression, simple_arithmetic_expression) | РАЗМЕР (collection_valued_path_expression)

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

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

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

+0

Поскольку Oskar требуется только 2, запрос должен быть доступен для записи без участия POW, хотя он будет многословным. Странно, что он жалуется на SQRT. Я буду экспериментировать с ним. – rayd09

+0

Подумайте об этом, вам даже не нужен SQRT, чтобы выполнить запрос, который вы хотите. Вы выбираете и заказываете квадрат расстояния и не принимаете квадратный корень, пока не получите свой небольшой набор результатов. Заказ будет таким же, независимо от того, используете ли вы квадрат расстояния или самого расстояния. – rayd09

+0

Хорошо, что военнопленный может быть расширен и что SQRT не имеет значения при сравнении. Проблема в том, что я не могу заставить какие-либо вычисления работать, если они помещены перед FROM. Я не уверен, как JPQL работает с этим и, если это вообще возможно. Худший случай, я думаю, я должен вернуться к родному SQL. – Oskar

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