Próbuję użyć Haversine formula, aby znaleźć obiekty w pobliżu lokalizacji w Spring Data JPA Query z Pageable, ale nie robię tego.Zapytanie o wiosnę: formuła Haversine z możliwością analizy
Moje pierwsze podejście wygląda tak
@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);
ale nie jako Wiosna/JPA wydaje się nie być w stanie używać aliasów w klauzuli WHERE. Kod SQL w stosie jest podobny do tego, aby alias w klauzuli where nie był zamieniany. Używanie "col_1_0_" (bez ") zamiast dist też nie działa
Zgodnie z tym SO Answer, przynajmniej MySQL jest interpretowany na lewą stronę i użycie aliasów w klauzuli Where nie jest możliwe. HAVING zamiast WHERE, ale także w klauzuli HAVING, alias nie jest rozwiązany
Wiem, że mogę przenieść formułę Haversine do klauzuli where, ale nadal potrzebuję tego w klauzuli "Zakonu" i myślę, że może spowolnić wydajność przy użyciu tej samej długiej formuły Haversine w klauzuli Zamawiam, ponieważ wybieram z kilkuset tysięcy elementów. sprzymierzeńcem, ale nie wiem jak zastosować stronicowalnej do tego:
@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 ;
}
Więc albo trzeba pierwsze podejście @query do pracy (które Wolę) OR drugie podejście z stronicowalnej
Wielkie dzięki! Czy w twoim przykładzie nie powinno być "m.latitude" zmienione na "e.latitude"? – Cir0X