2016-06-15 16 views
0
SELECT 
    feature_name, 
    (3959 * acos(cos(radians(37)) * cos(radians(lat)) 
     * cos(radians(long) - radians(-122)) + sin(radians(37)) 
     * sin(radians(lat)))) AS distance 
FROM 
    geo_features 
HAVING 
    distance < 25 
ORDER BY 
    distance 
+0

Vielleicht 'Abfrage query = create.query ("SELECT ...")' wie so? Es sollte hilfreiche Informationen auf der Herstellerseite von JOOQ geben - oder mische ich das mit etwas anderem? – Dilettant

Antwort

1

Unter der Annahme, dieser statische Import:

import static org.jooq.impl.DSL.*; 

Hier ist, wie Sie Ihre Abfrage schreiben:

GeoFeatures f = Tables.GEO_FEATURES; 
Field<Double> distance = 
    val(3959.0).mul(acos(cos(rad(37.0)))).mul(cos(rad(f.LAT))) 
       .mul(rad(f.LONG).sub(rad(-122.0)).add(sin(rad(37.0))) 
       .mul(sin(rad(f.LAT))).as("distance") 

DSL.using(configuration) 
    .select(
     f.FEATURE_NAME, 
     distance 
    ) 
    .from(f) 
    .having(distance.lt(25.0)) 
    .orderBy(distance) 

Dies sind wichtige Dinge im Auge zu behalten:

  • Jede SQL-Funktion übersetzt zu einer Funktion in org.jooq.impl.DSL
  • Arithmetische Operationen sind über „Infix“ -Notation zugänglich, aber die Betreiber haben als Methodennamen geschrieben werden, wie * = mul(), + = add() or plus(), - = sub() or minus()
  • Zahlen, die auf der linken Seite einer Rechenoperation sind, wurden durch jOOQ zu umwickelnden mit val() (für bind-Variablen) explizit API oder inline() (für inlining)
Verwandte Themen