找到距离内的所有地址

时间:2018-05-18 05:38:17

标签: hibernate spring-boot jpa spring-data-jpa

我需要根据指定的纬度/经度来检索地址+距离列表。

我的查询是:

@Query("Select new com.geolocation.AddressVM(A, "
    + "("
    + " 6371 * "
    + " acos( "
    + "     cos(radians(:lat)) * "
    + "     cos(radians(A.geoLocation.latitude)) *"
    + "     cos("
    + "         radians(A.geoLocation.longtitude) - radians(:lng)"
    + "     ) + "
    + "     sin(radians(:lat)) *"
    + "     sin(radians(A.geoLocation.latitude))" 
    + " ) "
    + ") as distance)  from #{#entityName} A "
    + "having distance > :distance")
List<AddressVM> list(@Param("lat") double lat, @Param("lng") double lng, @Param("distance") double distance);

但是,当我运行查询时,由于意外令牌而导致我出错,并且有#39;我认为距离&#39;在括号外没有看到。请帮助纠正我构建此查询。

1 个答案:

答案 0 :(得分:0)

只有MySQL和其他一些数据库允许在没有HAVING的情况下使用GROUP BY子句。我的猜测是这里不允许这样做,因此你得到了错误。一种解决方法是在正确的WHERE子句中重复距离表达式,其中此检查应该是:

Select new com.geolocation.AddressVM(A,
6371 * acos( cos(radians(:lat)) * cos(radians(A.geoLocation.latitude)) *
    cos( radians(A.geoLocation.longtitude) - radians(:lng) ) +
    sin(radians(:lat)) * sin(radians(A.geoLocation.latitude)) )
) as distance
from #{#entityName} A
where
    6371 * acos( cos(radians(:lat)) * cos(radians(A.geoLocation.latitude)) *
    cos( radians(A.geoLocation.longtitude) - radians(:lng) ) +
    sin(radians(:lat)) * sin(radians(A.geoLocation.latitude)) )
) > :distance

其他解决方法是子查询当前查询,然后重用distance别名。我不会完全写出来,但它看起来像这样:

SELECT *
FROM
(
    -- your current query
) t
WHERE t.distance > :distance

在这种情况下,我们可以在distance子句中使用WHERE别名,因为它已被实现为子查询中的实际列。