2012-04-12 81 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); 

一种替代方法是返回对象的方含城市+距离的列表,但是没有可能的地方,但是你可以限制结果集