JPQL для получения ближайших записей по широте и долготе - PullRequest
1 голос
/ 14 января 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 19 января 2010

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

0 голосов
/ 15 января 2010

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

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

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

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

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

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