【问题标题】:Hibernate exception. QuerySyntaxException: unexpected token: HAVING休眠异常。 QuerySyntaxException:意外令牌:HAVING
【发布时间】:2012-04-12 06:25:53
【问题描述】:

我尝试使用这个 HQL 查询:

   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]

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    尝试在您的查询中将HAVING 更改为WHERE

    【讨论】:

    • 现在Unknown column 'distance' in 'where clause'
    • distance 是该列的别名,您必须像在 select 中一样将整个计算放在 where 子句中。而不是列别名
    • 但是我无法对城市列表进行排序。
    • 嗯...Unknown column 'col_0_0_' in 'order clause'
    • 此查询有效:SELECT c, ( … ) AS distance FROM City c ORDER BY distance ASC。但没有WHERE
    【解决方案2】:

    仅当您使用 GROUP BY 时才允许使用关键字 HAVING(考虑为 GROUPS 使用类似 WHERE)。 请参阅reference manual 了解 SELECT 语法。

    【讨论】:

    • 是的,你是对的。现在我已将“拥有”更正为“在哪里”。并得到一个错误:Unknown column 'distance' in 'where clause'
    • @AntonTsivarev 您需要将表达式放在子查询中以引用距离。
    • @stacker,您不能在 from 中使用子查询表达式:“请注意,HQL 子查询只能出现在 select 或 where 子句中。” docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/…
    【解决方案3】:

    唯一的方法是使用原生查询,因为:

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

    另一种方法是返回包含城市 + 距离的对象列表,但不可能在哪里,但您可以限制结果集

    【讨论】:

    • 为我工作。我的代码中缺少 nativeQuery=true 参数。仅适用于那些尝试在 JPA 中执行查询的人,然后输入 nativeQuery = true 并尝试。
    【解决方案4】:

    嗯,“?”应该是什么?参数?

    如果为真,你应该像这样使用它

    HAVING distance < :distance
    

    并使用

    query.setParameter("distance", 50);
    

    【讨论】:

      【解决方案5】:

      试试

       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
      

      【讨论】:

        猜你喜欢
        • 2015-10-27
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 2019-05-07
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        相关资源
        最近更新 更多