java - mysql查询按多个坐标边界进行过滤

标签 java mysql geolocation mybatis boundary

我有一个包含带有坐标的城市列表的数据库,我使用 mybatis 进行此查询来查找给定边界的城市。

SELECT * FROM cities 
WHERE lat > #{latMin} 
AND lat < #{latMax} 
AND lng > #{lngMin} 
AND lng < #{lngMax}

现在我有多个边界,我多次调用查询以使所有城市包含在所有边界中,并且事情变得越来越慢。

为了加快速度,在不改变我的架构的情况下,我可以有一个接受输入(可能很长)边界列表的查询吗?也许是存储过程?

本项目的约束是mybatis作为持久层,mysql作为数据库。

编辑: 这是我目前的mybatis方法。

List<CityDTO> getCityNearPoint(@Param("latMin") Double latMin, @Param("latMax") Double latMax, 
             @Param("lngMin") Double lngMin, @Param("lngMax") Double lngMax);

我不知道如何传递包含边界的对象数组并将它们映射到多个 OR。像这样的东西:

List<CityDTO> getCityNearBoundaries(BoundaryDTO[] boundaries);

最佳答案

只需使用 OR 组合多个边界即可。您可以使用动态 SQL (s.foreach) 或 @SqlProvider 注释方法来实现它,这将生成适当的 SQL 字符串。我更喜欢使用动态 SQL。 在 xml 中,它看起来像这样:

<select id="selectCitiesByBoundaries" resultType="CityDTO">
  SELECT * FROM cities WHERE
  <foreach item="boundary" index="index" collection="#{boundaries}"
      open=" (" separator=") OR (" close=") ">
    lat > #{boundary.getLatMin()} AND
    lat < #{boundary.getLatMax()} AND
    lng > #{boundary.getLngMin()} AND
    lng < #{boundary.getLngMax()}
  </foreach>
</select>

关于java - mysql查询按多个坐标边界进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36473626/

相关文章:

Java: boolean 表达式中的短路评估

java - 如何在具有其他 Java 版本的计算机上安装 Java 8

Java:Thread.currentThread().getName()返回 "NO_THREAD_YET"

android 上的 javascript 地理定位不起作用

java - Eclipse JPA Facet 报告无效查询

mysql - SQL插入选择自动增量变量

MYSQL 日期复制和更新 + 14 天

mysql - 无法添加外键约束

java - 如何获取远程手机的位置详情

使用 GeolocationPermissions 的 Android WebView