2012-04-12 3 views
0

versuche ich diese HQL-Abfrage verwenden:Hibernate-Ausnahme. QuerySyntaxException: unerwartetes Token: having

Result.find("SELECT c, (3959 * acos(cos(radians(?)) * "+ 
    "cos(radians(c.latitude)) *"+ 
    "cos(radians(c.longitude) - radians(?)) +"+ 
    "sin(radians(?)) * sin(radians(c.latitude)))) " + 
    "AS distance FROM City c HAVING distance < ? ORDER BY distance ASC", 
    latitude, longitude, latitude, radius).fetch(); 

Aber in Folge:

IllegalArgumentException occured : org.hibernate.hql.ast.QuerySyntaxException: unexpected token: HAVING near line 1, column 204 [SELECT c, (3959 * acos(cos(radians(?)) * cos(radians(c.latitude)) *cos(radians(c.longitude) - radians(?)) +sin(radians(?)) * sin(radians(c.latitude)))) AS distance FROM models.City c HAVING distance < ? ORDER BY distance ASC] 

Antwort

1

versuchen HAVING-WHERE, in der Abfrage zu ändern.

+0

Jetzt 'Unbekannte Spalte' Abstand 'in' where Klausel'' –

+1

'Abstand' ist Alias ​​für die Spalte , müssen Sie die gesamte Berechnung wie in select, in where-Klausel auch setzen. statt Spaltenalias – Vikram

+0

Aber dann kann ich die Liste der Städte nicht sortieren. –

1

Das Schlüsselwort HAVING ist nur erlaubt, wenn Sie GROUP BY verwenden (denken Sie daran, WHERE für GROUPS zu haben). Siehe die reference manual für SELECT-Syntax.

+0

Ja, Sie haben Recht. Jetzt habe ich das "Haben" auf "Wo" korrigiert. Und bekam einen Fehler: 'Unbekannte Spalte 'distance' in 'where clause'' –

+0

@AntonTsivarev Sie müssen den Ausdruck in eine Unterabfrage stellen, um auf Abstand zu verweisen. – stacker

+0

@stacker, Sie können keinen Unterabfrageausdruck im from verwenden: "Beachten Sie, dass HQL-Unterabfragen nur in der select- oder where-Klausel vorkommen können." http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/#queryhql-subqueries –

0

Hm, was sollte "?" Parameter?

Wenn dies zutrifft, sollten Sie es verwenden, wie

HAVING distance < :distance 

und verwenden

query.setParameter("distance", 50); 
+0

Es PlayFramework –

0

versuchen

select dis.c,dis.distance(
    SELECT c, 
    (3959 * acos(cos(radians(?)) * cos(radians(c.latitude)) * 
cos(radians(c.longitude) - radians(?)) + sin(radians(?)) * 
sin(radians(c.latitude)))) AS distance FROM City c ) dis 
where dis.distance<? order by dis.distance ASC 
0

Der einzige Weg, eine native Abfrage zu verwenden ist, weil:

Java-Code:

@Query(value = "SELECT s.*,\n" + 
      " (\n" + 
      " 3959 * acos(\n" + 
      "  cos(radians(s.lat))\n" + 
      "  * cos(radians(:lat))\n" + 
      "  * cos(radians(:lon) - radians(s.lon))\n" + 
      "  + sin(radians(s.lat))\n" + 
      "   * sin(radians(:lat))\n" + 
      " )\n" + 
      " ) AS distance\n" + 
      "FROM Stop s\n" + 
      "HAVING distance < 30\n" + 
      "ORDER BY distance asc", nativeQuery = true) 
    List<Stop> findClosestStops(@Param("lat") Double lat, @Param("lon") Double lon); 

Eine Alternative eine Liste von Objekt zurückzukehren containg die Stadt + Abstand , aber nein, wo ist möglich, aber Sie können die Ergebnismenge beschränken