Java 通过多个坐标边界过滤的mysql查询
我有一个数据库,其中包含一个带有坐标的城市列表,我正在使用mybatis进行此查询,以查找给定边界的城市Java 通过多个坐标边界过滤的mysql查询,java,mysql,geolocation,mybatis,boundary,Java,Mysql,Geolocation,Mybatis,Boundary,我有一个数据库,其中包含一个带有坐标的城市列表,我正在使用mybatis进行此查询,以查找给定边界的城市 SELECT * FROM cities WHERE lat > #{latMin} AND lat < #{latMax} AND lng > #{lngMin} AND lng < #{lngMax} 现在我有了多个边界,我多次调用该查询,以使所有城市都包含在所有边界中,而且速度越来越慢 为了加快速度,在不改变我的架构的情况下,我可以有一个输入可能非常长
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);
我不知道如何传递包含边界的对象数组并将它们映射到多个ORs。比如:
List<CityDTO> getCityNearBoundaries(BoundaryDTO[] boundaries);
只需使用或组合多个边界。您可以使用动态SQLS实现它。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>
我不明白如何传递一组对象并将它们映射到多个ORs。我将编辑我的问题以澄清。