MySQL Umkreissuche - brauche Hilfe bei SQL Statement

beta20

Top Contributor
Hallo zusammen,
ich möchte eine Umkreissuche abbilden, brauche aber Hilfe bei einem HQL Statement:
Ich nutze JPA / Hibernate und habe einen Syntaxfehler:

Code:
SELECT count(m) FROM Mandatory m
WHERE  m.mandatoryAddressMain EXISTS
    ( SELECT * FROM
            ( SELECT *, ( 6371 * ACOS( COS( RADIANS( 0.0 ) ) * COS( RADIANS( ma.latitude ) ) * COS( RADIANS( ma.longitude ) - RADIANS( 0.0) ) + SIN( RADIANS( 0.0 ) ) * SIN( RADIANS( ma.latitude ) ) ) ) AS distance
              FROM MandatoryAddress ma) c
              WHERE distance < 200 AND (ma.latitude <> 0.0 AND ma.longitude <> 0.0)
              ORDER BY distance)
ORDER BY m.id DESC

Derzeit habe ich ein Error bei:
unexpected token: ,: line 1:126: unexpected token: ,
-> Also sprich vor "6371"....

Kann mir bitte jemand helfen...
Ich habe das Statement mit bereits Werten ausgeführt... Also sprich hier:
distance < 200

m.mandatoryAddressMain = 1:1 Beziehung.
Also sprich die Hauptadresse des Mandanten

Hat jemand Ideen?
 

mihe7

Top Contributor
WHERE m.mandatoryAddressMain EXISTS gibt keinen Sinn, das müsste einfach nur WHERE EXISTS heißen.

Nachtrag: Du verknüpft auch die Tabellen nicht, das ORDER BY dürfte auch sinnfrei sein. Was soll die Abfrage eigentlich liefern?
 

beta20

Top Contributor
Die Query soll mir die Mandanten liefern, die eine gewisse Distanz weit wegwohnen... (Mit dem COUNT dann eben die Anzahl)

Hier mal die WHERE - Clausel:
-> Wobei ich das so aufgebaut habe, dass es so aussieht:
WHERE
<hier können noch andere Bedingungen sein>
AND
Code:
                where.append(" EXISTS (SELECT * FROM ( SELECT *, ( 6371 * ACOS( COS( RADIANS( "
                        + loginMandatory.getMandatoryAddressMain().getLatitude()
                        + " ) ) * COS( RADIANS( ma.latitude ) ) * COS( RADIANS( ma.longitude ) - RADIANS( "
                        + loginMandatory.getMandatoryAddressMain().getLongitude() + ") ) + SIN( RADIANS( "
                        + loginMandatory.getMandatoryAddressMain().getLatitude()
                        + " ) ) * SIN( RADIANS( ma.latitude ) ) ) ) AS distance FROM MandatoryAddress ma) c WHERE distance < "
                        + o.getSearchValue() + " AND (ma.latitude <> "
                        + loginMandatory.getMandatoryAddressMain().getLatitude() + " AND ma.longitude <> "
                        + loginMandatory.getMandatoryAddressMain().getLongitude() + ") ORDER BY distance)");

Ich habe es nun abgeändert (wie oben beschrieben).
Bekomme nun aber ebenfalls einen Syntaxfehler:
unexpected token: :) line 1:105:
 

mihe7

Top Contributor
1. An welcher Stelle im SQL hakt es? (mit der Angabe line 1:105 kann man hier wenig anfangen)
2. Wenn man Abfrageparameter hat, baut man diese nicht manuell in einen SQL-String ein sondern nimmt ein PreparedStatement.
 

Thallius

Top Contributor
Ist es wirklich nötig die distanz so genau zu berechnen? Diese cos/sin Berechnung ist doch eigentlich nur nötig wenn die erdkrümmung eine entscheidende Rolle spielt und das wird es erst bei mehreren hundert Kilometern. Ich würde hier einen einfachen pythagoras nehmen. Damit bist du schonmal mehr als dreimal so schnell unterwegs

Dann verstehe ich die ganze Abfrage nicht. Warum nicht einfach ein

WHERE sqr((lat2 - lat1) ^ 2 + (long2 - long1) ^ 2) < maxdistance.

Gruß

Claus
 

beta20

Top Contributor
Wenn dies ebenfalls so funktioniert, dann ist das auch so ok für mich?
Wie sollte die Query dann aussehen?

Was ist dann bei dir lat2 und lat1?
Was ist long2 und was ist long1 ?
 

mihe7

Top Contributor
In etwa so:
Java:
String query = "SELECT * FROM MandatoryAddress ma WHERE sqrt(pow(ma.latitude-?,2) + pow(ma.longitude-?,2)) < ?";
try(PreparedStatement stmt = conn.prepareStatement(query)) {
     stmt.setDouble(1, loginMandatory.getMandatoryAddressMain().getLatitude());
     stmt.setDouble(2, loginMandatory.getMandatoryAddressMain().getLongitude());
     stmt.setDouble(3, distance);
     try(ResultSet rs = stmt.executeQuery()) {
         while (rs.next()) {
             ....
         }
     }
}
 

stg

Top Contributor
Code:
String query = "SELECT * FROM MandatoryAddress ma WHERE sqrt(pow(ma.latitude-?,2) + pow(ma.longitude-?,2)) < ?";

Sofern der Ansatz in Frage kommt, solltest du dann auch direkt die Abstandsquadrate vergleichen, anstatt der eigentlichen Abstände. dann sparst du dir die teure Wurzelberechnung.
 

beta20

Top Contributor
Code:
String query = "SELECT * FROM MandatoryAddress ma WHERE sqrt(pow(ma.latitude-?,2) + pow(ma.longitude-?,2)) < ?";

Sofern der Ansatz in Frage kommt, solltest du dann auch direkt die Abstandsquadrate vergleichen, anstatt der eigentlichen Abstände. dann sparst du dir die teure Wurzelberechnung.

Ok, danke. Aber eine Frage habe ich noch was das SQL angeht. Ich verstehe nicht so ganz was , 2 ist?
String query = "SELECT * FROM MandatoryAddress ma WHERE sqrt(pow(ma.latitude-?,2) + pow(ma.longitude-?,2)) < ?

Sehe ich das richtig, dass das so ist:
  • ? = Parameter für die Distanz
  • sqrt(pow(ma.latitude-?,2) -> 2 ist dann die latidute des eingeloggten Mandanten?
  • pow(ma.longitude-?,2)). -> 2 ist dann die longitude des eingeloggten Mandanten?
Danke für jede Hilfe
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Brauche Tipps für Datenbankdesign Datenbankprogrammierung 8
J Brauche Hilfe bei meinem Programm ! Datenbankprogrammierung 12
H Brauche Hilfe beim Mappen von 3 Tabellen a 1:n mit hbm.xml. Datenbankprogrammierung 34
F Brauche dringend Hilfe Java-Access Connection Datenbankprogrammierung 3
S ich brauche tipps für JDBC Datenbankprogrammierung 4
J brauche HILFE: java.lang.NoSuchMethodError: calculateSecurityWarningPosition Datenbankprogrammierung 2
D Welches System brauche ich? Datenbankprogrammierung 6
D Brauche hilfe bei Delete mit Datum! Datenbankprogrammierung 4
D brauche mal kurz hilfe bei einem select-stmt Datenbankprogrammierung 6
Edin JDBC Hilfe Datenbankprogrammierung 2
I Hilfe zu Multidimensionalen Datenbanken Datenbankprogrammierung 1
M SQL-Statement Hilfe bei SQL-Abfrage Datenbankprogrammierung 2
J Java Eclipse Hilfe beim Programmieren Datenbankprogrammierung 7
N Hilfe bei Projekt Datenbankprogrammierung 4
MrSnake Hilfe bei erstellen einer DB Datenbankprogrammierung 12
U PostgreSQL Hilfe bei Statementsyntax Datenbankprogrammierung 2
M SQL UPDATE richtig anwenden BITTE um HILFE Datenbankprogrammierung 3
M Hilfe bei grundlegendem Ansatz Datenbankprogrammierung 2
M Bitte um Hilfe bei Wahl einer Datenbank Datenbankprogrammierung 3
M hilfe zur einer Exception Datenbankprogrammierung 2
G Hilfe um String an Datenbank zu schicken Datenbankprogrammierung 3
E Dringend Hilfe Firebird/Jaybird verbindet nicht; im jar file Datenbankprogrammierung 4
S Benötige Hilfe mit DB Treiber Datenbankprogrammierung 4
P Benötige etwas Hilfe bei Datanbankabfrage über Java Datenbankprogrammierung 3
M Hilfe -Access mag sein Replace nciht merh Datenbankprogrammierung 2
G Hilfe: Werte sind alle x2 (oder mehr) nach JOIN Datenbankprogrammierung 13
M Hilfe - keine Connection zur DB Datenbankprogrammierung 4
M ORA-00911: invalid character . Hilfe! Datenbankprogrammierung 10
N Hilfe ! Mein Applet bekommt ein Access-Denied von MySQL Datenbankprogrammierung 7
I Hilfe bei umstellung. Datenbankprogrammierung 2
K Hilfe bei SQL-abfrage Datenbankprogrammierung 7
R Hilfe! Negative Zeitangabe Datenbankprogrammierung 2
I hilfe! java.sql.SQLException Datenbankprogrammierung 7
B Hilfe! Problem bei Verbindung über JDBC/ODBC Datenbankprogrammierung 4
T HILFE: MySQL und tomcat-5.5.4 == Name jdbc is not bound in t Datenbankprogrammierung 3
R Hilfe mit Umlauten und MSSQL Datenbankprogrammierung 10
G Hilfe bei Query für Spaltenansicht. Datenbankprogrammierung 20
6 Hilfe beim Einstieg Datenbankprogrammierung 15
M hilfe, wo bekomme ich Lektüre her? Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben