我有一个包含带有坐标的城市列表的数据库,我使用 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/