2017-02-10 2 views
1

Ich habe eine Datenbank, wo ich eine Abfrage erfolgreich in SQL gemacht habe, aber die Sache ist, dass ich diese Abfrage in JPQL für eine Methode eines REST-Dienstes schreiben muss.Wie übersetzt man arithmetischen Ausdruck von SQL nach JPQL?

Dies ist die Abfrage, die gearbeitet:

SELECT * FROM user u WHERE SQRT(POW(69.1 * (u.latitude - 38.0),2) + POW(69.1 * (-2.8 - u.longitude) * COS(u.latitude/57.3), 2)) < 100 

Ich brauche die Werte dort als „38.0“ geschrieben zu ändern und „-2,8“ und „100“, um Eingabeparameter und es in JPQL zu machen.

Dies ist, was ich

@GET 
@Path("nearusers={lat}&{lon}&{dist}") 
@Produces({MediaType.APPLICATION_JSON}) 
public List<Usuario> findNearUsers(@PathParam("lat") BigDecimal lat,@PathParam("lon") BigDecimal lon, @PathParam("dist") BigDecimal dist){ 

    TypedQuery query = getEntityManager().createQuery("SELECT u FROM User u WHERE SQRT(POW(69.1 * (u.latitude - :lat),2) + POW(69.1 * (:lon - u.longitude) * COS(u.latitude/57.3), 2)) < :dist",Usuario.class); 

    List<User> users = query 
      .setParameter("lat", lat) 
      .setParameter("lon", lon) 
      .setParameter("dist", dist) 
      .getResultList(); 
    return users; 
} 

versucht Und wenn ich diesen Service Methode starten, was von meinem Server Ich bin immer ein Fehler, der sagt:

Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing [SELECT u FROM Usuario u WHERE SQRT(POW(69.1 * (u.latitud - :lat),2) + POW(69.1 * (:lon - u.longitud) * COS(u.latitud/57.3), 2)) < :dist]. 
[35, 129] The encapsulated expression is not a valid expression 

Die IDE (Netbeans) ist einige Warnungen in der Zeile, die die Abfrage bilden: IDE warnings

Ich habe versucht, den Ausdruck mehrmals zu ändern, Klammern, Casting-Parameter hinzufügen zu verdoppeln, aber nichts hat funktioniert.

Antwort

0

POW und COS werden von JPQL nicht unterstützt. Zusätzlich zu grundlegenden arithmetischen Operationen unterstützt JPQL nur einen begrenzten Satz arithmetischer Operationen: ABS, SQRT, MOD, SIZE, INDEX (siehe JPA 2.1 Specification, Abschnitt 4.6.17.2.2).

Daher müssen Sie in dem SQL-Dialekt der Datenbank formuliert, um eine JPA nativen Abfrage verwenden:

Query query = getEntityManager().createNativeQuery(
    "SELECT * FROM user u WHERE SQRT(POW(69.1 * (u.latitude - ?1),2) + POW(69.1 * (?2 - u.longitude) * COS(u.latitude/57.3), 2)) < ?3", 
    User.class); 

List<User> users = query 
    .setParameter(1, lat) 
    .setParameter(2, lon) 
    .setParameter(3, dist) 
    .getResultList(); 

Beachten Sie, dass eine native Abfrage noch in der Lage ist verwalteten Einheiten zurückzukehren.

+0

Es hat funktioniert, vielen Dank !!! –

+0

Gut zu hören. Fühlen Sie sich frei, meine Antwort als akzeptiert zu markieren :) –

+0

Ich markierte sofort, wenn ich geccked, dass funktionierte aber stackoverlows sagt, dass ich nicht genug Ruf als richtig zu markieren, weil ich ein neuer Benutzer bin, und dass sie nur meine Stimme aufzeichnen können, aber nicht zeigen . Entschuldigung für diesen Kumpel. Trotzdem danke nochmal für die Hilfe! Edit: Sorry war ein Fehler, die Sache war, dass ich versuchte, anstelle der Marke als angenommen zu stimmen, sorry dafür, dass es mein erster Beitrag war. –

Verwandte Themen