2012-04-12 80 views
0

我嘗試用這個的HQL查詢:Hibernate異常。 QuerySyntaxException:意外的標記: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(); 

但結果:

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] 

回答

1

嘗試改變HAVINGWHERE,在您的查詢。

+0

現在''where'子句'中'未知列的距離' – 2012-04-12 06:35:57

+1

'distance'是列的別名,你必須把整個計算放在select中,也放在where子句中。而不是列別名 – Vikram 2012-04-12 06:38:22

+0

但是我無法對城市列表進行排序。 – 2012-04-12 06:41:02

1

關鍵字HAVING只有在您使用GROUP BY時纔會被允許(想像組裏有WHERE)。 有關SELECT語法,請參見reference manual

+0

是的,你是對的。現在我已經糾正了'有'到'在哪裏'。並且出現錯誤:'where子句'中的未知列距' – 2012-04-12 06:38:54

+0

@AntonTsivarev您需要將表達式放在子查詢中以引用距離。 – stacker 2012-04-12 06:57:15

+0

@stacker,您不能在from中使用子查詢表達式:「請注意,HQL子查詢只能出現在select或where子句中。」 http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/#queryhql-subqueries – 2015-11-10 19:40:49

0

嗯,應該是什麼「?」參數?

如果屬實,你應該使用它像

HAVING distance < :distance 

,並使用

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

It PlayFramework – 2012-04-12 06:36:48

0

嘗試

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

的唯一方法是使用本地查詢,因爲:

Java代碼:

@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); 

一種替代方法是返回對象的方含城市+距離的列表,但是沒有可能的地方,但是你可以限制結果集