【问题标题】:HQL gives "unnexpected AST node (" within case clauseHQL 在 case 子句中给出“意外的 AST 节点”
【发布时间】:2019-02-06 16:56:19
【问题描述】:

这是一个简化的查询,会重现错误:

SELECT 
 CASE 
     WHEN contains(buffer(r.polygon, 0.009), h.latlng) THEN 1 
     ELSE 0 
 END as near 
FROM Region r, House h 
WHERE r.id = 732 AND h.id = 892877180

执行session.createQuery(hql) 将抛出QuerySyntaxException: unexpected AST node: ( near line 1, column 32。第 32 列是第一个 contains 之后的左括号。

由于底层数据库是 MySQL,而这个 HQL 恰好也是有效的 MySQL,所以我针对 MySQL 数据库测试了完全相同的查询,它运行良好。所以我假设这个问题依赖于 Hibernate Query Language 语法。

我在 Hibernate 文档中没有找到任何地方说明不支持在 CASE WHEN ... THEN 子句中使用函数,也没有关于此问题的错误报告。

请注意,当没有 CASE 子句时,它可以正常工作:

SELECT contains(buffer(r.polygon, 0.009), h.latlng) as near 
FROM Region r, House h 
WHERE r.id = 732 AND h.id = 892877180

我在 Ubuntu Linux 18.04.1 上使用 Hibernate ORM 4.3.11、Hibernate Spatial 4.3 和 MySQL 5.6.34。

【问题讨论】:

    标签: hibernate hql hibernate-spatial


    【解决方案1】:

    我认为这是因为 HQL 解析器需要 CASE WHEN-clause 中的关系表达式,而不仅仅是任何布尔表达式。我怀疑这会起作用:

    SELECT 
     CASE 
       WHEN contains(buffer(r.polygon, 0.009), h.latlng) = TRUE THEN 1 
     ELSE 0 
    END as near  
    FROM Region r, House h 
    WHERE r.id = 732 AND h.id = 892877180
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-28
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2019-08-23
      相关资源
      最近更新 更多