我需要根据指定的纬度/经度来检索地址+距离列表。
我的查询是:
@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;在括号外没有看到。请帮助纠正我构建此查询。
答案 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
别名,因为它已被实现为子查询中的实际列。