【问题标题】:JPA(Hibernate) - find nearest 10 objects by longitude / latitudeJPA(Hibernate) - 按经度/纬度查找最近的 10 个对象
【发布时间】:2017-12-20 15:47:39
【问题描述】:

如何按经度/纬度查询最近的 10 个对象(在我的例子中是 Distributors)。

每个经销商都有经度/纬度坐标。我正在使用 Spring Data 进行简单查询,但据我所知,没有选择使用 Spring Data 进行此类查询。

【问题讨论】:

  • 您可以根据您的要求使用自定义查询来获取数据,像这样@Query("SELECT t.title FROM Todo t where t.id = :id") String findTitleById(@Param("id") Long id);
  • 这没用。我不需要通过 id 来查找经销商。
  • 如何使用存储过程,如果查询很复杂并且您不想通过指定自定义参数来处理它,这里有一个可以帮助您的指南。 Calling stored procedure via spring data
  • this answer。您必须在答案中显示的查询中添加ORDER BYLIMITOFFSET 子句,以获得最近/最远的 10。

标签: java spring hibernate jpa spring-data


【解决方案1】:

如果您可以在底层数据库中执行此操作,则可以将 Named Native Query 添加到您的实体类中,并使用实体管理器来执行该查询。

例如,我的GeoUnit 类有一个地理围栏原生查询,采用纬度和经度两个参数:

@NamedNativeQuery(name = "GeoUnit.geofencing", query = "SELECT * FROM GeoUnit g WHERE " +
    "g.shape.STContains(geography::STPointFromText('POINT(' || :longitude" +
    " || ' ' || :latitude || ')', 4326)", resultClass = GeoUnit.class)
public class GeoUnit {
  // ...
}

调用它:

entityManager.createNativeQuery("GeoUnit.geofencing").setParameter("longitude", lon)
    .setParameter("latitude", lat).getResultList();

要让您的 Entity 类在 Java 中包含地理空间数据类型(不一定必须),您可以例如使用休眠空间:http://www.hibernatespatial.org/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    相关资源
    最近更新 更多