CriteriaBuilder半径计算

时间:2016-04-14 12:08:21

标签: java mysql hibernate jpa

我试图用距离计算给定的纬度/长度,并且仅返回落在该圆距离的行(数据库具有纬度/长坐标)。我不知道的是我会怎么做。我目前正在使用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查询,并仅检索落在该区域中的行,将它们与存储在数据库中的纬度/经度坐标进行比较。

3 个答案:

答案 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是参数占位符 需要一些计算来衡量latitudelongitude的距离。 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对于此类复杂查询的功能不够强大。但是无论如何你都可以用这个技巧来做到这一点:

  1. 创建MySQL FUNCTION
  2. 使用CriteriaBuilder#function(..)
  3. 调用此功能

    它应该也很快。因此我必须注意,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/