2016-04-07 20 views
0

Ich habe eine Datenbank mit einer Liste von Städten mit Koordinaten, und ich verwende mybatis mit dieser Abfrage, um Städte mit einer Grenze zu finden.mysql Abfrage nach mehreren Koordinaten Grenzen

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

Jetzt habe ich mehrere Grenzen, und ich rufe die Abfrage mehrmals alle Städte in allen Grenzen enthalten haben, und es wird immer langsamer.

Um die Dinge zu beschleunigen, ohne meine Architektur zu ändern, kann ich eine einzige Abfrage haben, die eine (möglicherweise sehr lange) Liste von Grenzen eingibt? Vielleicht eine gespeicherte Prozedur?

Die Einschränkungen in diesem Projekt sind Mybatis als Persistenzschicht und Mysql als db.

bearbeiten: Dies ist meine aktuelle mybatis-Methode.

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

Ich weiß nicht, wie ein Array von Objekten zu übergeben, die die Grenzen enthält und sie auf mehrere OPs abzubilden. Etwas wie:

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

Antwort

0

Kombinieren Sie einfach mehrere Grenzen mit OR. Sie können es mit der Methode Annotated von Dynamic SQL (s. Foreach) oder @SqlProvider erreichen, die eine entsprechende SQL-Zeichenfolge generiert. Ich würde lieber Dynamic SQL verwenden. In xml wird es wie folgt aussehen:

<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> 
+0

Ich verstehe nicht, wie ich ein Array von Objekten passieren kann und sie auf mehrere OPs abzubilden. Ich werde meine Frage bearbeiten, um zu klären. – Alessandro