我试图用距离计算给定的纬度/长度,并且仅返回落在该圆距离的行(数据库具有纬度/长坐标)。我不知道的是我会怎么做。我目前正在使用Native SQL,并且使用带有计算此值的hasrsine公式的纯文本,如果我是正确的,则无法使用CriteriaBuilder执行hasrsine公式。但是我希望使用CriteriaBuilder获得相同的结果。我已经尝试过使用hibernate-spatial依赖,但我并没有像我想要的那样让它工作。我也遵循过这样的教程。
https://docs.jboss.org/hibernate/search/4.2/reference/en-US/html/spatial.html
我使用的数据库是MySQL Hibernate版本4.3.10。
此教程也没有让我走得很远Using JPA Criteria Api and hibernate spatial 4 together
那么我将如何使用具有给定纬度/长度和距离的MySQL构建CriteriaBuilder查询,并仅检索落在该区域中的行,将它们与存储在数据库中的纬度/经度坐标进行比较。
答案 0 :(得分:3)
我尝试了以下内容并且有效。
@Query(value = "SELECT s FROM Address s WHERE 1 = 1 AND " +
"(pow(69.1 * (s.latitude - ?1), 2) + pow(69.1 * (?2 - s.longitude) * cos(s.latitude / 57.3), 2)) < pow(?3,2)"
)
List<Address> findNearbyAddress(double lat, double lng, double radius);
radius
英里。 ?1, ?2, ?3
是参数占位符
需要一些计算来衡量latitude
和longitude
的距离。 database native function
。您无法从CriteriaBuilder
致电public List<string> DisplayLocation(EmployeeDetails location)
{
InsertToFSRDataContext context = new InsertToFSRDataContext();
var loc = from z in context.Parameters where z.ParamGroup == "LOCATION" orderby z.ParamValue ascending select z.ParamDesc;
// this assumes that z.ParamDesc is a string
return loc.ToList<string>();
}
。
答案 1 :(得分:2)
CriteriaBuilder
对于此类复杂查询的功能不够强大。但是无论如何你都可以用这个技巧来做到这一点:
它应该也很快。因此我必须注意,mysql并不适合像距离计算这样的用例。
答案 2 :(得分:0)
我过去通过查询上面建议的矩形,然后对这些结果进行距离计算来完成此操作。既然你应该已经消除了大量的数据,那么进行这些计算就不那么容易了。由于这只是数值范围查询,因此它不需要任何奇怪的插件或集成,如果索引纬度和长列,应该可以非常快速地获得结果。
请参阅: Given GPS coordinates, how do I find nearby landmarks or points-of-interest?
此网站详细介绍了在SQL中执行Haversine公式。我仍然会考虑将边界框应用为where子句,以便DB不对表中的每一行进行计算。 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/