Я пытаюсь использовать Haversine formula, чтобы найти объекты рядом с местоположением в Spring Data JPA Query с Pageable, но я не сделаю это.Весенний запрос: Формула Хаверсина со страницей
Мой первый подход выглядит следующим образом
@Query("SELECT m, (6371 * acos(cos(radians(:latitude)) * cos(radians(m.latitude)) * cos(radians(m.longitude) - radians(:longitude)) + sin(radians(:latitude)) * sin(radians(m.latitude)))) as dist FROM Entity m WHERE dist < :distance ORDER BY dist DESC")
public List<Entity> findEntitiesByLocation(@Param("latitude") final double latitude, @Param("longitude") final double longitude, @Param("distance") final double distance, Pageable pageable);
но терпит неудачу как Spring/JPA, кажется, не способен использовать псевдонимы в ИНЕКЕ. SQL в стеке выглядит так:
select (...),(haversine) as col_1_0_ where dist<? order by col_1_0_ DESC
так что псевдоним в предложении where не заменяется. Использование «col_1_0_» (без «)» вместо «dist» также не работает.
В соответствии с этим SO Answer по крайней мере MySQL интерпретируется наизнанку и использование псевдонимов в предложении Where не представляется возможным. HAVING вместо WHERE, но также и в предложении HAVING, псевдоним не разрешен.
Я знаю, что могу переместить Формулу Хаверсина в предложение where, но мне все еще нужно это в предложении Order By, и я думаю, что это может замедлить производительность, используя ту же самую длинную формулу Хаверсина в предложении Order By, как я выбираю из нескольких сотен тысяч объектов.
Затем я попытался создать Query manu союзник, но я не знаю, как применить выгружаемой к этому:
@Override
public List<Entity> findEntitiesByLocation(final double latitude, final double longitude, final double distance, Pageable pageable) {
final javax.persistence.Query query = this.entityManager.createQuery(SELECT_ENTITES_BY_DISTANCE);
query.setParameter("latitude", latitude);
query.setParameter("longitude", longitude);
query.setParameter("distance", distance);
final List<Entity> entities = query.getResultList();
// order by distance
entities .sort(new EntityDistanceComparator(latitude, longitude));
return entities ;
}
Итак, я либо нужен первый подход с @Query работать (я бы предпочел) ИЛИ второй подход с выгружаемой
Спасибо большое! Не должен ли 'm.latitude' изменяться на' e.latitude' в вашем примере? – Cir0X